最短路問題 小結

2021-06-22 23:18:26 字數 2632 閱讀 1637

分類: 小結

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

print

?<

span

style

="font-size:14px;"

>

void floyd(int n)  

span

>

2.dijkstra演算法

求單源、無負權的最短路。時效性較好,時間複雜度為o(v*v+e);

以貪心法選取未被處理的具有最小權值的節點,然後對其的出邊進行鬆弛操作;

核心**:

[html]view plain

copy

print

?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

print

?<

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

print

?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行...