演算法8-11:最短路徑演算法之負權

來源:互聯網
上載者:User

標籤:圖論   演算法   最短路徑   應用   

負權指的是一張圖中包含一條權重小於0的邊。負環指的是一張圖中存在權重只和為負數的環。如果一張圖中存在負環,那麼這張圖是沒有最短路徑的。


那麼,假設圖中不存在負環,但是有負權,那麼最短路徑如何求解呢?答案就是使用Bellman-Ford演算法,該演算法的效能一般。


基本思想


Bellman-Ford演算法的基本思想就是對圖中所有的邊都進行V次“放鬆”操作。所以該演算法的複雜度是E×V。


該演算法的計算過程如所示。



改進


實際應用中會對演算法進行改進。改進方法就是用隊列記錄發生變化的頂點,這樣能減少平均複雜度,但是無法減少最壞情況下的複雜度。


代碼

public class BellmanFordSP extends SP {    public BellmanFordSP(EdgeWeightedDigraph G, int s) {        super(G, s);         // 將所有頂點到原點的距離設為無窮大        // 注意:下面這段代碼不要遺漏        for(int i=0;i<G.V();i++){            distTo[i] = Double.POSITIVE_INFINITY;        }        distTo[s] = 0;         for(int i=0;i<G.V();i++){            for(int v=0;v<G.V();v++){                for(DirectedEdge e:G.adj(v)){                    relax(e);                }            }        }    }}


演算法總結


無環有負權,使用拓撲排序演算法,複雜度為E+V

有環無負權,使用Dijkstra演算法,複雜度為E logV

有環有負權,使用Bellman-Ford演算法,複雜度為E V


應用


炒匯


下表展示了個幣種之間的匯率情況。如果不考慮交易的手續約,匯率價格不變,那麼可以找出一條迴圈賺錢的路徑,這個路徑就是通過尋找負環得出的。



arbitrage opportunity

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.