1. 程式人生 > >dijkstra算法---通過邊實現松弛

dijkstra算法---通過邊實現松弛

素材 i++ amp 技術分享 數組 一個 strong 選擇 ima

圖片素材借鑒啊哈磊的博客

該算法用於解決一個點到其余各頂點的最短路徑

技術分享

先來一張圖,求1點到6點的最短路徑

這讓我想起了差點掛科的運籌學

先用一個二維數組

技術分享

還有一個一維數組存儲1點到各點的距離

技術分享

這個一維數組的值稱為估計值。在1點可直接到達的點中選擇一個最近的點,即點2.然後點2的值也就成為了確定值。

why。因為路徑是正數,也不可能通過其他的中轉點縮短點1到點2的路程。

經過了點2,再看看點2能夠到達哪些點。即點3和點4。先討論下通過點2這個中轉點是否能夠縮短點1到點3的路程。答案是可以的。1+9<12.修改一維數組對應的值。

這個就叫松弛

同理比較點1到點4距離和通過點2中轉的距離。

剩下的3,4,5,6點自己試試。不然運籌學很容易掛的

最後答案是

技術分享

貼出核心算法

  for(i=1;i<=n-1;i++)
    {
        //找到離1號頂點最近的頂點
        min=inf;//初始min為正無窮
        for(j=1;j<=n;j++)
        {
            if(book[j]==0 && dis[j]<min)
            {
                min=dis[j];//取得離源點直接相連的最近的點的距離
                u=j;
            }
        }
        book[u]=1;//將該點納入已經確定要走的點的集合
        for(v=1;v<=n;v++)//這裏就如同遍歷哥各點到點2的距離
        {
            if(e[u][v]<inf)
            {
                if(dis[v]>dis[u]+e[u][v]) 
                    dis[v]=dis[u]+e[u][v];
            }
        }    
    }

  

dijkstra算法---通過邊實現松弛