Dijkstra演算法和SPFA演算法

2021-10-08 12:33:07 字數 2857 閱讀 3128

spfa演算法

#include

using

namespace std;

const

int n=

1e4+

10,m=

5e5+10;

int n,m,x,y,z,s,cnt,dis[n]

,vis[n]

,head[n]

;struct edge

e[m]

;//定義邊的三個資訊,w表示邊權,to表示邊的終點,next表示上一條邊

void

add(

int x,

int y,

int z)

//鏈式前向星存邊

queue<

int>q;

void

spfa()

}}}int

main()

for(

int i=

1;i<=n;i++

)//dis陣列初始化

dis[i]

=2147483647

;spfa()

;for

(int i=

1;i<=n;i++

) i==n?

printf

("%d\n"

,dis[i]):

printf

("%d "

,dis[i]);

return0;

}

/*

思路:用鏈式向前星儲存頂點之間的關係與權值

用優先佇列儲存邊權小的先出

首先將起點入隊,向四周發散,再將起點與到達點的總權值入隊,

保證了是一步一步到達(如果不連通不可能遍歷到),同時遍歷的過程當中不斷找更小的權值並更新

優先佇列的用處:若有兩種不同的到達方式,優先佇列會先遍歷到短的那一條,然後將其入隊,那遠的一條就不會入隊。

*/#include

using

namespace std;

typedef

long

long ll;

const

int n=

5e5+

10,m=

2e5+10;

int n,m,s,x,y,z,cnt,vis[n]

,head[n]

;long

long dis[n]

;struct edge

e[n]

;void

add(

int x,

int y,

int z)

struct node

;bool

operator

<

(const node &s1,

const node &s2)

priority_queueq;

void

dij())

;//起點入隊

dis[s]=0

;//起點路程為0

while

(!q.

empty()

));//將終點入隊}}

}}intmain()

for(

int i=

0;i<=n;i++

) dis[i]

=2147483647

;dij()

;for

(int i=

1;i<=n;i++

)printf

("%lld "

,dis[i]);

return0;

}

思路就是將最短路上的路徑遍歷一遍,都堵一次,找花費時間最大的。

/*

思路:用鏈式向前星儲存頂點之間的關係與權值

用優先佇列儲存邊權小的先出

首先將起點入隊,向四周發散,再將起點與到達點的總權值入隊,

保證了是一步一步到達(如果不連通不可能遍歷到),同時遍歷的過程當中不斷找更小的權值並更新

優先佇列的用處:若有兩種不同的到達方式,優先佇列會先遍歷到短的那一條,然後將其入隊,那遠的一條就不會入隊。

*/#include

using

namespace std;

const

int n=

1e3+

10,m=

2e5+10;

int n,m,s,x,y,z,cnt,vis[n]

,head[n]

,st,ed,flag;

int dis[n]

,last[n]

;struct edge

e[n*n]

;void

add(

int x,

int y,

int z)

struct node

;bool

operator

<

(const node &s1,

const node &s2)

//過載運算子,優先佇列中的自定義排序

//注意寫大於號還是小於號與實際的符號相反,實際是小於號,則要寫大於號

priority_queueq;

void

dij())

; dis[s]=0

;while

(!q.

empty()

));}

}}}int

main()

dij();

int ans=0;

ed=n;

flag=1;

while

(ed!=1)

cout

}

dijkstra演算法和spfa演算法

void dijkstra s u 1 將這個點標記 證明以後可以使用這個點作為中間點了 for int j 1 j n j spfa模板 struct edge edge maxm 結構體表示靜態鄰接表 void addedge int from,int to,int dis 鄰接表建圖 void...

Bellman Ford演算法 和 SPFA演算法

bellman ford演算法是求含負權圖 的單源最短路徑演算法,效率很低,但 很容易寫。即進行不停地鬆弛 relaxation 每次鬆弛把每條邊都更新一下,若n 1次鬆弛後還能更新,則說明圖中有負環 即負權迴路,本文最後有解釋 無法得出結果,否則就成功完成。bellman ford演算法有乙個小優...

Bellman Ford演算法和SPFA演算法

最短路徑是圖論中乙個很經典的問題 給定圖g v,e 求一條從起點到終點的路徑,使得這條路徑上經過的所有邊的邊權之和最小。對任意給出的圖g v,e 和起點s 終點t,如何求從s到t的最短路徑。解決最短路徑問題的常用演算法有dijkstra演算法 bellman ford演算法 spea演算法和floy...