spfa 期望複雜度o(ke)
基本思想:最短路:dijkstra演算法+路徑輸出
建邊寫法:建邊——鄰接矩陣、vector、鏈式向前星
1、可以思考下這3種寫法,分別是怎麼遍歷完有相同起點的所有邊的#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]);
}}
2、處理完後,沒有路徑的頂點的結果是什麼
3、為什麼dij不能解決邊權有負值的情況
優先佇列優化dij+鏈式前向星 複雜度o(mlogn)
m是圖的邊數,n是頂點數
用優先佇列優化後,就可以直接從隊首得到下乙個頂點,省去了遍歷圖中每個頂點去找下乙個頂點(如果此時與處在隊首的頂點已經遍歷過了,即vs[pos]=1,因為某個節點可能被放進去很多次,後面的就可以直接跳過)
定義乙個結構體,結構體中包含兩個資料:頂點和該頂點到起點的距離,然後更新一次就將這個頂點和新的距離值放入佇列,設定下結構體的優先順序,讓距離大的沉到隊尾
**(沒有提交過,但是大概寫法是這樣子得):
例題:2872: no game no life#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*/
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...