dijkstra算法学习
生活随笔
收集整理的這篇文章主要介紹了
dijkstra算法学习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
dijkstra算法學習
一、最短路徑
單源最短路徑:計算源點到其他各頂點的最短路徑的長度
全局最短路徑:圖中任意兩點的最短路徑
Dijkstra、Bellman-Ford、SPFA求單源最短路徑
Floyed可以求全局最短路徑,但是效率比較低
SPFA算法是Bellman-Ford算法的隊列優化
Dijkstra算法不能求帶負權邊的最短路徑,而SPFA算法、Bellman-Ford算法、Floyd-Warshall可以求帶負權邊的最短路徑。
Bellman-Ford算法的核心代碼只有4行,Floyd-Warshall算法的核心代碼只有5行。
深度優先遍歷可以求一個點到另一個點的最短路徑的長度
二、dijkstra算法圖解
三、算法步驟
1.初始化,選擇好初始點,設總共有vexnum個節點,則總共要將vexnum-1個節點放入s中
for(i = 1;i<G.vexnum;i++)2.遍歷U,找出其中最短路徑的點,并作記錄(放入S中)
// 遍歷G.vexnum-1次;每次找出一個頂點的最短路徑。for (i = 1; i < G.vexnum; i++){// 尋找當前最小的路徑;// 即,在未獲取最短路徑的頂點中,找到離vs最近的頂點(k)。min = INF;for (j = 0; j < G.vexnum; j++){if (flag[j]==0 && dist[j]<min){min = dist[j];k = j;}}// 標記"頂點k"為已經獲取到最短路徑flag[k] = 1;3.更新剩余U中節點的距離:設步驟2中加入的節點為k,最短距離為min,則if(k的鄰居到k的距離+min)<dist(D,k的鄰居),則更新dist(D,k的鄰居)
// 修正當前最短路徑和前驅頂點// 即,當已經"頂點k的最短路徑"之后,更新"未獲取最短路徑的頂點的最短路徑和前驅頂點"。for (j = 0; j < G.vexnum; j++){tmp = (G.matrix[k][j]==INF ? INF : (min + G.matrix[k][j])); // 防止溢出if (flag[j] == 0 && (tmp < dist[j]) ){dist[j] = tmp;prev[j] = k;}}}四、完整代碼
/** Dijkstra最短路徑。* 即,統計圖(G)中"頂點vs"到其它各個頂點的最短路徑。** 參數說明:* G -- 圖* vs -- 起始頂點(start vertex)。即計算"頂點vs"到其它頂點的最短路徑。* prev -- 前驅頂點數組。即,prev[i]的值是"頂點vs"到"頂點i"的最短路徑所經歷的全部頂點中,位于"頂點i"之前的那個頂點。* dist -- 長度數組。即,dist[i]是"頂點vs"到"頂點i"的最短路徑的長度。*/ void dijkstra(Graph G, int vs, int prev[], int dist[]) {int i,j,k;int min;int tmp;int flag[MAX]; // flag[i]=1表示"頂點vs"到"頂點i"的最短路徑已成功獲取。// 初始化for (i = 0; i < G.vexnum; i++){flag[i] = 0; // 頂點i的最短路徑還沒獲取到。prev[i] = 0; // 頂點i的前驅頂點為0。dist[i] = G.matrix[vs][i];// 頂點i的最短路徑為"頂點vs"到"頂點i"的權。 }// 對"頂點vs"自身進行初始化flag[vs] = 1;dist[vs] = 0;// 遍歷G.vexnum-1次;每次找出一個頂點的最短路徑。for (i = 1; i < G.vexnum; i++){// 尋找當前最小的路徑;// 即,在未獲取最短路徑的頂點中,找到離vs最近的頂點(k)。min = INF;for (j = 0; j < G.vexnum; j++){if (flag[j]==0 && dist[j]<min){min = dist[j];k = j;}}// 標記"頂點k"為已經獲取到最短路徑flag[k] = 1;// 修正當前最短路徑和前驅頂點// 即,當已經"頂點k的最短路徑"之后,更新"未獲取最短路徑的頂點的最短路徑和前驅頂點"。for (j = 0; j < G.vexnum; j++){tmp = (G.matrix[k][j]==INF ? INF : (min + G.matrix[k][j])); // 防止溢出if (flag[j] == 0 && (tmp < dist[j]) ){dist[j] = tmp;prev[j] = k;}}}// 打印dijkstra最短路徑的結果printf("dijkstra(%c): \n", G.vexs[vs]);for (i = 0; i < G.vexnum; i++)printf(" shortest(%c, %c)=%d\n", G.vexs[vs], G.vexs[i], dist[i]); }參考資料:http://www.cnblogs.com/skywang12345/p/3711512.html
?
轉載于:https://www.cnblogs.com/nathan2young/p/9196590.html
總結
以上是生活随笔為你收集整理的dijkstra算法学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单两字女生网名144个
- 下一篇: 奇偶换行颜色变化