最短路模板 堆優化dijstra spfa

2022-10-05 06:12:10 字數 1669 閱讀 8476

/*

*\最短路模板

輸入: n m s t 接下來m行 u, v, w表示u -> v 有一條權值為w的無向邊

input:

3 3 1 2

1 2 3

2 3 4

1 3 5

output:3\*

*/#include

using

namespace

std;

#define fi first

#define se second

#define go continue

#define int long long

#define pii pair#define sf(x) scanf("%lld",&x)

#define ytz int _; sf(_); while(_--)

#define fory(i,a,b) for(int i = a; i <= b; ++i)

#define forl(i,a,b) for(int i = a; i >= b; --i)

#define debug(a) cout << #a << " = " << a int n = 1e5 + 10

;struct

node

e[n

<< 1

];int cnt = 0

, head[n];

inline

void add_edge(int u, int v, int

w)inline

void

init()

intn, m, s, t;

structv};

intdis[n];

bool

vis[n];

/**\

dijstra

1、從源點開始每次選取乙個離點集距離最近的點t 新增到集合中

2、利用t點對集合中的點進行鬆弛操作,進行更新

3、使用堆進行1找點的操作降低時間複雜度

4、不能在有負邊權的圖中使用

\**/

inline

void dijstra(int s, int

t));

while(!q.empty()));}

}}

if(dis[t] > 0x3f3f3f3f) cout << -1

;

else cout <*\spfa演算法思路:

1、每次迭代,取出隊頭點v,依次列舉從v出發的邊,v->u,設邊的長度為w

判斷dis[v] + w 是否小於dis[u], 小於則更新值,

2、由於s-u的距離變短了,有可能u能改變其他點,使用vis陣列判斷是否在佇列,沒有則放入

3、若乙個點的入隊次數超過n,則存在負環

\**/

queue

q1;inline

void spfa(int s, int

t) }}}

if(dis[t] >= 0x3f3f3f3f) cout << -1

;

else cout <}inline

void

solve()

//dijstra(s, t);

spfa(s, t);

}signed main()

最短路(Dijstra演算法)

一,問題基本概念 最短路問題 若網路中的每條邊都有乙個數值 長度,時間,成本等 則找出兩點 通常是源節點和阱節點 之間總權和最小的路徑就是最短路問題。單源最短路 可以採用dijkstra演算法 但是只可以求無負權的最短路徑 時間複雜度為o v 2 如果圖中又負權賄賂,可以採用bellman ford...

dij最短路 堆優化

dij乙個主要思路,將所有點分為兩個集合s,t,初始集合s中只包含了起點,t集合包含所有點,要做的就是從t集合中不斷選取與s集合中的點距離最短的並且未被加入s集合中的點,將這個點加入s集合,並用這個點去更新所有與這個點相鄰的點,重複操作直到所有點都被加入s集合中。下面看一下dij的過程 dij演算法...

最短路徑 Dijstra演算法(單源)

定義 所謂最短路徑問題是指 如果從圖中某一頂點 源點 到達另一頂點 終點 的路徑可能不止一條,如何找到一條路徑使得沿此路徑上各邊的權值總和 稱為路徑長度 達到最小。dijkstra 迪傑斯特拉 演算法 他的演算法思想是按路徑長度遞增的次序一步一步併入來求取,是貪心演算法的乙個應用,用來解決單源點到其...