本來以為自己不用總結
回頭再看這幾種演算法都忘光了qaq
如果存在乙個環(從某個點出發又回到自己的路徑),而且這個環上所有權值之和是負數,那這就是乙個負權環,也叫負權迴路
floyd演算法適合解決多源最短路
複雜度最高
解決負邊(負權)但不能解決負環
void
floyd()
//floyd}}
}//最後map[i][j]表示任意i到j的最短距離
bellman_ford可以用來判斷負權迴路或正權迴路
適合稀疏圖
適合解決單源最短路徑
void
bellman_ford()
for(i=
1;i<=n;i++
) dis[1]
=0;//以1為源點
for(k=
1;k<=n-
1;k++
)//鬆弛n-1次}if
(check==0)
break
;//不用再更新了,結束迴圈
} flag=1;
for(i=
1;i<=n;i++)}
if(f==0)
printf
("存在負權環\n");
}//dis[i]中記錄1到i的最短距離
dijkstra適合解決稠密圖(點的範圍很大但是邊不多)
適用於解決單源最短路徑
不能解決負邊權
void
dijkstra
(int t)
//類似最小生成樹
vis[t]=1
;for
(i=1
; ivis[minn]=1
;for
(j=1
; j<=n; j++)}
}}//dis[i]表示起點t到i的最短距離
前向星
建圖方法:以儲存邊的方式來儲存圖。在構造圖時,把邊存放在陣列裡,不需使用指標,只需乙個 next 即可是整個圖構建完成 。
適用條件:點集特別多的稀疏圖,邊數多且繁雜,開鄰接矩陣會浪費大量記憶體。
時間複雜度:o(m),並不比鄰接鍊錶差
spfa是一種用佇列優化的b-f演算法
可以解決負邊問題,可以判斷負環是否存在
//spfa+前向星
struct node
edge[
500005];
//記錄邊的資訊
int head[
500001];
//記以u為起點的所有弧的編號
int cnt;
void
add(
int u,
int v,
int w)
//cnt=0;
// memset(head,-1,sizeof(head));
void
spfa
(int s,
int e)}}
}}
int
spfa()
//判斷負權迴路}}
}return0;
}
最短路總結
寫個部落格記錄一下最短路的幾種演算法,盡量做最正確的解答,減少大家的疑惑,網上有好多講的都抄來抄去,還有好多講的都是錯誤的。熟悉的最短路演算法就幾種 bellman ford,dijkstra,spfa,floyd,下面針對這幾個演算法具體解析一下。首先說明一點,就是關於負環的問題。bellman ...
最短路總結
穿越空間的限制,走最短的路找到你 u v之間的最短路滿足以下限制 對任意k g v,e 有 dist u,v dis u,k dis k,j 關鍵操作 鬆弛 void relax int i,int j,int k floyd void floyd 複雜度o v 3 可處理負環 拓展把所有邊存成負的...
最短路總結
首先是dij演算法,這是我第乙個掌握的最短路演算法!再來是bellman ford演算法,這個演算法比較容易理解,而且考慮到了負環的存在。記住,它對圖中的邊進行了 v 1次操作!首先,對d進行初始化 還有乙個spfa演算法 摘錄於學長空間 設立乙個先進先出的佇列用來儲存待優化的結點,優化時每次取出隊...