最短路常用模板整理

2021-10-10 00:24:57 字數 1411 閱讀 1114

單源最短路,dijkstra演算法,適用於無負權邊情況,簡單時間複雜度o(n^2),堆優化時間複雜度為o((m+n)log n)、變形也可求最短路徑最大權值和最長路徑最小權值

int cost[max_v][max_v]; //圖的鄰接矩陣

int d[max_v];//頂點s(起點)到各點的最短距離

bool used[max_v];//是否已經訪問過

int v;//頂點數

int prev[max_v];//前驅頂點

void dijkstra(int s)}}

}vectorget_path(int t)

stl 佇列實現

struct edge;

typedef pairp; //first是最短距離,second是頂點編號

int v;

vectorg[max_v];

int d[max_v];

void dij(int s)}}

}

任意兩點最短路,floyd演算法,適用於無負權環的情況,時間複雜度為o(n^3)

int d[max_v][max_v]; //無法到達時,權值為inf,主對角線為0

int v; //頂點數

void floyd()edge[600];

ll dis[600];

int n,m;

bool bellman_ford()

} }for(int j=1;j<=m;++j)

return true;

}

還有個時間複雜度未知的演算法為spfa,就是寫起來太複雜了,返回false代表有負環,可以判斷有沒有負環,但無法處理有負環的圖

#include "bits/stdc++.h"

using namespace std;

const int maxn = 200010 ;

struct edge

e[ maxn ];

int n,m,cnt,p[ maxn ],dis[ maxn ];

int in[maxn ];

bool visited[ maxn ];

void add_edge ( const int x , const int y , const int z )

bool spfa(const int s)}}

}return true;

}int main ( )

if ( !spfa ( s ) ) printf ( "fail!\n" ) ;

else printf ( "%d\n" , dis[ t ] ) ;

return 0;

}

最短路模板

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