1. 程式人生 > >Dijkstra 路徑規劃 C#

Dijkstra 路徑規劃 C#

示例無向圖如下:(起始點為v0)

鄰接矩陣為:

注意:其中沒有連線的邊和自己到自己的點權值用10000表示。

 

程式碼:

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;//記錄過程點         }       }     }   } }

 

結果

  

 

解析:

  分三部分,主函式中給出圖中的初始鄰接矩陣,頂點個數。以及初始化最短路徑的頂點集合和點路線集合。

  IsContain(int m,int[] S)這個函式是在每次迴圈的時候判斷該點是否已經在最短路徑集合中,即已經遍歷過。

  接下來就是Dijkstra演算法,大致步驟如下:

    1、新增初始頂點v0在集合S中,遍歷第一行,找最小的權值所在的頂點列值j。

    2、將j值做為下一個點加入集合S中,輸出此時到達j點的最小路徑。

    3、重新初始化第一行的值,通過判斷加入某點後graph[next][j]+min是否小於graph[0, j](其中j不在集合S中),若是則替換後者,並記錄此過程 mid[j] = mid[next] + "->V" + next;

    4、迴圈1、2、3步驟頂點數-1次。

  

詳細參考:https://blog.csdn.net/qq_25954259/article/details/78289335?locationNum=5&fps=1