最短路模板

2021-10-08 12:01:14 字數 3170 閱讀 7328

·有重邊的情況下盡量用鄰接表存圖

·記得處理第乙個加入集合的點

·dijkstra演算法沒法處理負權邊

基礎版本

void

dijkstra(int

s)  

}  }  

優化版本(優先佇列)

struct

element  

};  

struct

nodee[maxn*6];  

void

adde(int

u,int

v,int

w)  

void

dijkstra(int

s));  

dis[s]=0;  

while

(!q.empty()));  

}  }  

}·此演算法最大優勢是處理負邊權,判斷負環(正環)

·至多執行n-1次

·用陣列+結構體存圖,因為是遍歷邊而不是點

·複雜度o(ne),適用於稀疏圖

struct

edge  

;  edge v[3*n];  

longlong

dis[n];  

bool

bellman_ford()  

bool

flag=1;

//標記有無負環

for

(int

i=1;i<=m;++i)  

if

(dis[v[i].y]>dis[v[i].x]+v[i].cost)

//鬆弛是否成功

return

flag;  

}  ·對ford演算法的優化

·處理負環正環

非遞迴方式

bool

spfa()  

}  }return

1;//順利完成

}遞迴方式

bool

spfa(int

u)  

}  vis[u]=0;

//回溯

return

1;//沒有負環

}  ·唯一的多源最短路演算法

·思想是dp

·外層列舉中間點,內層列舉起點,最內層列舉終點

基本模板

//提前將鄰接矩陣存在dis陣列裡,其他不連通的地方初始化成無窮大

for

(int

k=1;k<=n;++k)

//列舉中間點

for

(int

i=1;i<=n;++i)

//列舉起點

if

(i!=k)

//節省時間,如果一樣就不往下走

for

(int

j=1;j<=n;++j)

//列舉終點

if

(i!=j&&j!=k)

//繼續判斷,如果有一樣的就不往下走

dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);

//狀態轉移方程,也就是所謂的鬆弛操作

擴充套件例題洛谷

p1119

災後重建

題意:每個道路有排序的修建時間,詢問多個時間點的s到t的最短路

題解:正好可以用floyd的思想解決,每修好一次村子,跑一遍內層迴圈,

dis[0][i][j]是原始鄰接矩陣資料

狀態轉移方程:

dis[k][i][j]=min(dis[k−1][i][j],dis[k−1][i][k]+dis[k−1][k][j])

for

(;t[k]<=w&&k<=n;++k)

//如果詢問的天數沒有被處理到就以在k以前修好的村莊為中間點跑floyd

for

(int

i=1;i<=n;++i)  

if

(i!=k)  

for

(int

j=1;j<=n;++j)  

if

(i!=j&&j!=k)  

dis[i][j]=dis[j][i]=min(dis[i][j],dis[i][k]+dis[k][j]);

//板子

最短路模板

1.dijkstra演算法 演算法思想 從某乙個點開始,找與它距離最近的乙個點,然後更新所有點到這條路徑的距離,然後再次選取乙個距離上乙個點路徑最短的點,將其加入路徑,以此進行,直到求出起點到所有點的最短距離.注意 權值不能為負,如圖 1到3的距離應該是零,但這裡結果為一 1 鄰接矩陣 複雜度 o ...

最短路模板

週六週日tyvj上有模擬賽 順便逃了周練 霧 複習了一下圖論裡的基本演算法 彷彿第一次寫最短路的手生 寫的太少了 orz dijkstra include define maxn 10001 define maxm 300001 using namespace std template void r...

最短路模板

include include include include include include define inf 0x3f3f3f3f using namespace std const int maxn 105 int dis maxn pre maxn struct edge 邊 edge ...