示例無向圖以下:(起始點爲v0)算法
鄰接矩陣爲:函數
注意:其中沒有鏈接的邊和本身到本身的點權值用10000表示。spa
代碼:.net
static void Main(string[] args) {
int[,] graph = new int[,] { { 10000, 10000, 10, 10000, 30, 100 }, { 10000, 10000, 5, 10000, 10000, 10000 }, { 10, 5, 10000, 50, 10000, 10000 }, { 10000, 10000, 50, 10000, 10000, 10 }, { 30, 10000, 10000, 20, 10000, 60 }, { 100, 10000, 10000, 10, 60, 10000 } };
int n = 6;
int[] S = new int[n]; //最短路徑的頂點集合 string[] mid = new string[n];//點的路線 for (int i = 0; i < n; i++) { S[i] = 0; mid[i] = ""; } ShortestPathByDijkstra(n, graph, S, mid);
} public static int IsContain(int m,int[] S)//判斷該頂點是否已經計算過 { int index = -1; for (int i = 1; i < 6; i++) { if (S[i] == m) { index = i; } } return index; }
/// <summary> /// Dijkstrah實現最短路算法 /// </summary> static void ShortestPathByDijkstra(int n,int[,] graph, int[] S, string[] mid) { int min; int next; for (int f = n-1; f > 0; f--) { //置爲初始值 min = 1000; next = 0;//第一行最小的元素所在的列 next點 //找出第一行最小的列值 for (int j = 1; j < n; j++)//循環第0行的列 { if ((IsContain(j,S) == -1) && (graph[0, j] < min))//不在S中,找出第一行最小的元素所在的列 { min = graph[0, j]; next = j; } } //將下一個點加入S S[next] = next; if (min == 1000) { Console.WriteLine("V0到V{0}的最短路徑爲:無", next); } else { Console.WriteLine("V0到V{0}的最短路徑爲:{1},路徑爲:V0{2}->V{0}", next, min, mid[next]); } // 從新初始0行全部列值 for (int j = 1; j < n; j++)//循環第0行的列 { if (IsContain(j,S) == -1)//初始化除包含在S中的 { if ((graph[next, j] + min) < graph[0, j])//若是小於原來的值就替換 { graph[0, j] = graph[next, j] + min; mid[j] = mid[next] + "->V" + next;//記錄過程點 } } } } }
結果code
解析:blog
分三部分,主函數中給出圖中的初始鄰接矩陣,頂點個數。以及初始化最短路徑的頂點集合和點路線集合。get
IsContain(int m,int[] S)這個函數是在每次循環的時候判斷該點是否已經在最短路徑集合中,即已經遍歷過。string
接下來就是Dijkstra算法,大體步驟以下:it
一、添加初始頂點v0在集合S中,遍歷第一行,找最小的權值所在的頂點列值j。io
二、將j值作爲下一個點加入集合S中,輸出此時到達j點的最小路徑。
三、從新初始化第一行的值,經過判斷加入某點後graph[next][j]+min是否小於graph[0, j](其中j不在集合S中),如果則替換後者,並記錄此過程 mid[j] = mid[next] + "->V" + next;
四、循環一、二、3步驟頂點數-1次。
詳細參考:https://blog.csdn.net/qq_25954259/article/details/78289335?locationNum=5&fps=1