ACM 模板 最短路

2021-08-08 10:03:24 字數 1109 閱讀 7668

最短路演算法

一、floyd演算法主要用於求任意兩點間的最短路徑,也成最短最短路徑問題。

求多源、無負權邊的最短路。用矩陣記錄圖。時效性較差,時間複雜度o(v^3)。

模板:

//鄰接矩陣

void floyd()}}

}

二、單源最短路徑演算法——dijkstra

1、思想描述:當q(一開始為所有節點的集合)非空時,不斷地將q中的最小值u取出,然後放到s(最短路徑的節點的集合)集合中,然後遍歷所有與u鄰接的邊,如果可以進行鬆弛,則對便進行相應的鬆弛。。。

優化版本就是加入堆排序的dijkstra

模板:鄰接矩陣版本

/**

* 返回從v---->到target的最短路徑

*/int dijkstra(int v)

dis[v] = 0;

s[v] = true;

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

} s[pos] = 1;

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

} }return dis[target];

}

struct node

}t;//堆優化的迪佳斯特拉演算法

priority_queue q;

void dijkstra()

} }}

三、使用bellman-ford演算法

bellmen-ford演算法介紹:

思想:其實bellman-ford的思想和dijkstra的是很像的,其關鍵點都在於不斷地對邊進行鬆弛。而最大的區別就在於前者能作用於負邊權的情況。其實現思路還是在求出最短路徑後,判斷此刻是否還能對邊進行鬆弛,如果還能進行鬆弛,便說明還有負邊權的邊.

四、使用spfa演算法

spfa只是對bellmen-ford進行佇列優化

模板://鄰接表

vectorg[m];

struct edge

e[m*m];

void spfa()}}

}}

//鄰接矩陣版本

最短路模板

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