【圖論】最短路

Floyed算法

    【思想】Floyed-Warshall 算法用來找出每對點之間的最短距離。它需要用鄰接矩陣來儲存邊,這個算法通過考慮最佳子路徑來                   得到最佳路徑。 注意單 獨一條邊的路徑也不一定是最佳路徑。

        從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,或者無窮大,如果兩點之間沒有邊相連。
        對於每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比己知的路徑更短。如果是更新它。
        時間複雜度O(n^3),只要有存下鄰接矩陣的空間,時間一般沒問題,並且不必擔心負權邊的問題。
【實現】
   for (i=1;i<=n;i++) 
      for (j=1;j<=n;j++) map[i][j]=INF;
    for (i=1;i<=n;i++) 
    {
      scanf("%d%d%d",&peo[i],&a,&b);
      map[i][a]=1; map[a][i]=1;
      map[i][b]=1; map[b][i]=1;
      }
    for (k=1;k<=n;k++)
      for (i=1;i<=n;i++)
       for (j=1;j<=n;j++) 
        if (i!=j && j!=k && i!=k)
          if (map[i][j]>map[i][k]+map[k][j])
            map[i][j]=map[i][k]+map[k][j];

注意:弗洛耶德算法(Floyed算法)思想可用與判斷有向圖中任意兩點是否連通 算法如下:

for k:=1 to n do
  for i:=1 to n do
    for j:=1 to n do
      if (a[i,k]=1)and (a[k,j]=1) then a[i,j]=1
{a[i,j]=1表示i可達j,a[i,j]=0表示i不可達j}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章