C 最短路問題基礎演算法模板

2021-10-03 10:32:46 字數 1877 閱讀 2433

先上本篇部落格的主要內容(有一處打錯了應該是dijkstra)

時間複雜度為o(n2),多用於不存在負權邊的稠密圖(指邊數遠大於節點數)中

int g[n]

[n], dis[n]

, n, m;

//g[n][n]為鄰接矩陣用於儲存每條邊,dis[n]儲存某個點到1號點的最小距離, n為點數,m為邊數

bool visit[n]

;//儲存每個點的最短路是否確定

intdijkstra()

visit[t]

=true

;//用t更新其他點的距離

for(

int j =

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

return dis[n]

;}

時間複雜度為(mlogn),多用於不存在負權邊且為稀疏圖(邊數約等於節點數)中

typedef pair<

int,

int> p;

int h[n]

, ne[n]

, e[n]

, w[n]

, idx;

//用鄰接表來儲存邊

int n, m, dis[n]

;//儲存所有點到一號點的距離

bool visit[n]

;//判斷每個點的最短路是否確定

void

add(

int a,

int b,

int c)

//將邊新增到鄰接表中

intdijkstra

(void))

;//first儲存距離, second儲存編號

while

(!heap.

empty()

));}

}}return dis[n]

;}

時間複雜度為o(nm),用於存在負權邊的最短路徑,也可存在負權迴路

int n, m;

// n表示點數,m表示邊數

int dist[n]

;// dist[x]儲存1到x的最短路距離

struct edge // 邊,a表示出點,b表示入點,w表示邊的權重

edges[m]

;// 求1到n的最短路距離,如果無法從1走到n,則返回-1。

intbellman_ford()

}if(dist[n]

>

0x3f3f3f3f/2

)return-1

;return dist[n]

;}

最常用的最短路演算法之一,時間複雜度為o(m),最壞情況下為o(nm)

int h[n]

, w[n]

, ne[n]

, e[n]

, idx;

//用鄰接表儲存邊

int n, m, dis[n]

;//儲存每個點到1號點距離

bool visit[n]

;//判斷每個點是否在佇列中

void

add(

int a,

int b,

int c)

intspfa

(void)}

}}return dis[n]

;}

時間複雜度為o(n3),用於求多源最短路問題

int dis[n]

[n], n, m, k;

intfloyd()}}}

個人學習使用

最短路演算法模板

首先是dijkstra演算法,dijkstra演算法適用於邊權為正的情況,它可用於計算正權圖上的單源最短路,即從單個源點出發,到所有結點的最短路,該演算法同時適用於有向圖和無向圖。給出 的時間複雜度為o mlogn m為邊的數目,n為點的數目。struct edge 初始化邊 struct heap...

基礎最短路(模板 bellman ford)

description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 1...

最短路SPFA演算法模板

其實如果是最短路的裸題的話是不用寫這種傳參的spfa的,直接定義全域性變數就好了,但是很多題都是要求兩點甚至更多點到其他點最短路,因此加上了引數。include include include include define maxn 10005 define inf 0x3f3f3f3f using...