最短路總結

2021-10-01 03:08:10 字數 1703 閱讀 5554

本來以為自己不用總結

回頭再看這幾種演算法都忘光了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演算法 摘錄於學長空間 設立乙個先進先出的佇列用來儲存待優化的結點,優化時每次取出隊...