分類: 小結
2014-06-06 14:57
93人閱讀收藏
舉報最短路徑問題是圖論研究中的乙個經典演算法問題, 旨在尋找圖(由結點和路徑組成的)中兩結點之間的最短路徑。 演算法具體的形式包括:
確定起點的最短路徑問題 - 即已知起始結點,求最短路徑的問題。
確定終點的最短路徑問題 - 與確定起點的問題相反,該問題是已知終結結點,求最短路徑的問題。在無向圖中該問題與確定起點的問題完全等同,在有向圖中該問題等同於把所有路徑方向反轉的確定起點的問題。
確定起點終點的最短路徑問題 - 即已知起點和終點,求兩結點之間的最短路徑。
全域性最短路徑問題 - 求圖中所有的最短路徑。
最常用的路徑演算法有:
1.floyd演算法。
2.dijkstra演算法。
3.bellman-ford演算法。
4.spfa演算法。
下面逐個來講解。。。
1.floyd演算法。
求多源、無負權邊的最短路。時效性較差,時間複雜度o(v^3)。空間複雜度為o(n^2)。是解決任意兩點間的最短路徑的一種演算法。
核心**:
[html]view plain
copy
?<
span
style
="font-size:14px;"
>
void floyd(int n)
span
>
2.dijkstra演算法
求單源、無負權的最短路。時效性較好,時間複雜度為o(v*v+e);
以貪心法選取未被處理的具有最小權值的節點,然後對其的出邊進行鬆弛操作;
核心**:
[html]view plain
copy
?int dijkstra (int v)
//進行n-1次操作 選擇最短路
for (i=1
;i<
n;i++)
} vist[pos]=1;
//鬆弛操作
for (j=1
;j<
=n;j++)
} return dis[n];
}
3.bellman-ford演算法
求單源最短路,可以判斷有無負權迴路(若有,則不存在最短路),時效性較好,時間複雜度o(ve)。和dijkstra一樣都以鬆弛操作為基礎,即估計的最短路徑值漸漸地被更加準確
的值替代,直至得到最優解。
它的原理是對圖進行n-1次鬆弛操作,得到所有可能的最短路徑。其優於
dijkstra的方面是邊的權值可以為負數、實現簡單,缺點是時間複雜度過高
。但是可以進行優化,提高效率。
負權環判定
因為負權環可以無限制的降低總花費,所以如果發現第n次操作仍可降低花銷,
就一定存在負權環。
核心**:
[html]view plain
copy
?<
prename
="code"
class
="html"
>
struct node
p[inf];
int dis[inf];//用來儲存遠點至當前點的最短路徑 迭代更新
// 點數 邊數 源點
int nodenum,edgenum,source,i,j;
//初始化
void init ()
dis[source]=0;
for (i=0
; i<
edgenum
; i++)
} int bellman_ford ()
} if (flag
==0)
break;
} //判斷負環
//上面兩層for迴圈結束之後 dis陣列裡儲存的就是遠點到當前點的最短路
//如果還能進行鬆弛操作的話就說明有負環存在
for (i=0
; i<
edgenum
; i++)
} }
4.spfa演算法是bellman-ford的佇列優化,時效性相對好,時間複雜度o(ke)。(k<核心**:
[html]view plain
copy
?void spfa(int s,int e) // s點 到 e點
} } vis[p] = 0;
} if(dis[e]!= inf)
printf("%d\n",dis[e]);
else
printf("-1\n");
}
最短路小結
通過對最短路的學習,我已經部分掌握了3大演算法及其變形,會用一些知識去解決問題,但學無止境,仍有許多知識我知之甚少,我希望通過我的努力會變得越來越強。floyd經典演算法適合多源最短路,由於複雜度較高,適合資料較小的題目,但也有些題目可由floyd的變形去做。dijkstra演算法為單源最短路,主要...
最短路演算法小結
dijkstra演算法 適用於 無負權邊,無環 視所求得 最短 定義而論 的圖的單源最短路問題 也就是考慮乙個點 常用 dist i 陣列儲存源點 到 i 點的距離,應用貪心的思想,每次 從 未選 點集中 選出距離已選點集最近 最優 的乙個點,然後將此點加入已選點集,嘗試通過此點 更新 源點 到未選...
最短路 最短路徑問題
題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...