題目描述:傳送門
題解思路:
此題目如果直接套用單源最短路徑的模板並且不使用優化(即無最小堆或者優先佇列幫助實現),並以鄰接矩陣的方式儲存點和邊及權值,最多只能得到70分,測試點卡在mle上。
在無優化的單源最短路徑模板上,倘若使用前向星的方法來實現邊和點的儲存(只換了儲存方式,其他的操作和思想沒變),便能輕鬆通過所有測試資料。
那麼什麼是前向星呢?
此處(說白了就是一種儲存結構,雖然實現比鄰接矩陣更複雜,但是時間和空間上都優於鄰接矩陣)
首先貼出鄰接矩陣的**(主要是為了方便理解單源最短路徑的模板是如何實現的,基本就是直接套用模板加上微弱的改動)
1 #include2using
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 #include2using
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...