單源最短路徑模板(弱化版)

2022-08-17 15:27:16 字數 1856 閱讀 8423

題目描述:傳送門

題解思路:

此題目如果直接套用單源最短路徑的模板並且不使用優化(即無最小堆或者優先佇列幫助實現),並以鄰接矩陣的方式儲存點和邊及權值,最多只能得到70分,測試點卡在mle上。

在無優化的單源最短路徑模板上,倘若使用前向星的方法來實現邊和點的儲存(只換了儲存方式,其他的操作和思想沒變),便能輕鬆通過所有測試資料。

那麼什麼是前向星呢?

此處(說白了就是一種儲存結構,雖然實現比鄰接矩陣更複雜,但是時間和空間上都優於鄰接矩陣)

首先貼出鄰接矩陣的**(主要是為了方便理解單源最短路徑的模板是如何實現的,基本就是直接套用模板加上微弱的改動)

1 #include2

using

namespace

std;

3int max=10005;4

int infty=2147483647;5

int white=0;6

int black=1;7

int gray=2;8

intn,m,s;

9int a[10005][10005]=;

1011

//鄰接矩陣

12void

dijkstra()

19 d[s]=0;20

21 color[s]=gray;

2223

while(1)31

}32if(u==-1) break

;33 color[u]=black;

34for(int j=1;j<=n;j++)41}

42}43for(int i=1;i<=n;i++)46}

47int

main()else59}

60}6162

dijkstra();

63return0;

64 }

現在貼出使用前向星後的**:

1 #include2

using

namespace

std;

3int max=10005;4

long

long infty=2147483647; //

由於題目說明無法達到則設定成2^31-1,故直接可將初始距離設為2^31-1

5int white=0;6

int black=1;7

int gray=2;8

intn,m,s;

9int cnt=0;10

11struct

edgee[500005

];16

int head[10005

];17

18void

dijkstra()

25 d[s]=0;26

27 color[s]=gray;

2829

while(1)37

}38if(u==-1) break

;39 color[u]=black;

40int temp=head[u]; //

取出與u連線的第一條邊,temp為其編號

41for(int k=temp;~k;k=e[k].next)48}

4950}51

for(int i=1;i<=n;i++)54}

55void add(int u,int v,int w)

62int

main()

7273

dijkstra();

74return0;

7576 }

由上面可以對比看見,主要思想沒有改變,只是在儲存和遍歷的時候的方式不同而已。

模板 單源最短路徑(弱化版)

本題測試資料為隨機資料,在考試中可能會出現構造資料讓spfa不通過,如有需要請移步 p4779。如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊...

P3371 模板 單源最短路徑(弱化版)

題目 p3371 模板 單源最短路徑 弱化版 本題測試資料為隨機資料,在考試中可能會出現構造資料讓spfa不通過,如有需要請移步 p4779。如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。輸入格式 第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m...

P3371 模板 單源最短路徑(弱化版)

使用模版注意事項 注意頂點數maxn的值 注意極大資料inf的值 此題inf 2147483647 使用模版前言 注意頂點數maxn的值 注意極大資料inf的值 include include include include include include include define maxn 3...