最短路演算法 dij SPFA

2021-09-25 08:56:04 字數 3399 閱讀 2361

spfa 期望複雜度o(ke)

基本思想:最短路:dijkstra演算法+路徑輸出

建邊寫法:建邊——鄰接矩陣、vector、鏈式向前星

#include

#include

#include

#include

#include

#include

#include

typedef

long

long ll;

using namespace std;

const

int manx=

1e5+10;

const

int inf=

0x3f3f3f3f

;int dis[

300]

,vs[

300]

,head[

300]

;int n,m,cou;

struct node

edge[manx<<2]

;void

add(

int s,

int e,

int len)

; head[s]

=cou++;}

void

dij(

int s,

int e)

} nx=-1

;//標記距離最小的位置

for(

int j=

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

(nx==-1

)break

; vs[nx]=1

;}}int

main()

//scanf("%d%d",&s,&e);

s=1,e=n;

dij(s,e);if

(dis[e]

==inf)

else

printf

("%d\n"

,dis[e]);

}}

1、可以思考下這3種寫法,分別是怎麼遍歷完有相同起點的所有邊的

2、處理完後,沒有路徑的頂點的結果是什麼

3、為什麼dij不能解決邊權有負值的情況

優先佇列優化dij+鏈式前向星 複雜度o(mlogn)

m是圖的邊數,n是頂點數

用優先佇列優化後,就可以直接從隊首得到下乙個頂點,省去了遍歷圖中每個頂點去找下乙個頂點(如果此時與處在隊首的頂點已經遍歷過了,即vs[pos]=1,因為某個節點可能被放進去很多次,後面的就可以直接跳過)

定義乙個結構體,結構體中包含兩個資料:頂點和該頂點到起點的距離,然後更新一次就將這個頂點和新的距離值放入佇列,設定下結構體的優先順序,讓距離大的沉到隊尾

**(沒有提交過,但是大概寫法是這樣子得):

#include

#include

#include

#include

#include

#include

typedef

long

long ll;

using namespace std;

#define chl (root<<1)

#define chr ((root<<1)|1)

#define mid ((l+r)>>1)

const

int manx=

1e5+10;

const

int inf=

0x3f3f3f3f

;int cou=

0,head[

1010

],path[manx][2

],dis[

1010];

bool vs[

1010];

struct node

edge[manx]

;void

add(

int s,

int e,

int len)

; head[s]

=cou++;}

struct poi

;bool operator<

(poi a,poi b)

intdij

(int s,

int e));

while

(!qu.

empty()

));}

}}return dis[e];}

intmain()

ans=

dij(s,e)

;printf

("%d\n"

,ans);}

/*5 5 1 5

1 2 2

2 3 2

2 4 2

3 5 100

4 5 2*/

例題:2872: no game no life

e是圖的邊數,k是乙個常數很多情況下k不超過2(不包含有可到達負環的情況)

可以解決邊權有負值的,最長路等等dij無法處理的。

鏈式向前星版本:

#include

#include

#include

#include

#include

#include

typedef

long

long ll;

using namespace std;

const

int manx=

1e5+10;

const

int inf=

0x3f3f3f3f

;int dis[

300]

,vs[

300]

,head[

300]

;int n,m,cou;

struct node

edge[manx<<2]

;void

add(

int s,

int e,

int len)

; head[s]

=cou++;}

vectorvt[

300]

;int

spfa

(int s)}}

vs[sx]=0

;}return1;

}int

main()

//scanf("%d%d",&s,&e);

s=1,e=n;

int flag=

spfa

(s);if(

!flag)

continue;if

(dis[e]

==inf)

else

printf

("%d\n"

,dis[e]);

}}

最短路徑演算法 最短路

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

最短路演算法

常用的最短路演算法有三種 disjkstra,floyd,ballman floyd 一 disjkstra演算法 dijkstra演算法要求圖上的權非負數。同樣使用於無向圖 html view plain copy include stdio.h hdu 2544 define maxsum 0x...

最短路演算法

最短路演算法有很多,具體哪個好,和資料是有很大關係的 從起點開始向外擴充套件,最壞o v e 實際體驗比o e log v 的dijkstra可能快 include include define max e 4002 define max v 1002 define inf 0x3f3f3f usi...