【問題描述】
有乙個郵遞員要送東西,郵局在節點1.他總共要送n-1樣東西,其目的地分別是2~n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有m條道路,通過每條道路需要一定的時間。這個郵遞員每次只能帶一樣東西。求送完這n-1樣東西並且最終回到郵局最少需要多少時間。
5 10
2 3 5
1 5 5
3 5 6
1 2 8
1 3 8
5 3 4
4 1 8
4 5 3
3 5 6
5 4 2 83
看到這題……這不明擺著赤裸裸的最短路嘛,而且還要往返走,還是單向的,n<=1000,還用說什麼?鄰接矩陣+floyed搞起啊!然而……交上oj後發現,僅僅ac了4個點……tle6個……算了算複雜度,嗯……不錯,最大可以到o(10^9)不爆才怪了……於是換一種思路……那麼只能求單源最短路了,怎麼求呢?兩邊dijkstra一邊算過去的,一邊算回來的……然後順便注意一下重邊,於是ac了……
下面我們來總結一下求最短路的方法,求多源最短路……不用說,只能floyed,如果資料給大了的話肯定就是你想錯了,比如今天這道題……由一點出發回到同一點的題可以看做單源最短路,如果沒有負權邊的話能用dijkstra盡量用dijkstra,(自我感覺dijkstra最好寫……)當然願意寫spfa是最佳選擇,spfa的時間複雜度是最低的。然後,對於儲存圖的問題,能用鄰接矩陣盡量用鄰接矩陣,鄰接矩陣比鄰接表還是方便許多的,(便於debug,便於觀察),如果實在不行的話那就只能用鄰接表了,願意用鄰接表的用鄰接表也可以。(自我感覺不願意去寫……)
1var a:array[-1..1010,-1..1010] of
longint;
2i,j,n,m,u,v,w,ans,k:longint;
3 f:array[-1..1010] of
boolean;
4 s1,s2:array[-1..1010] of
longint;
5procedure
dijkstra;
6var
i,j,min,pos:longint;
7begin
8 f[1]:=true;
9for i:=2
to n do
10begin
11 min:=maxlongint;
12 pos:=-1
; 13
for j:=1
to n do
14if
not(f[j])and(s1[j]then
15begin
16 min:=s1[j];
17 pos:=j;
18end
; 19
if pos=-1
then
20break;
21 f[pos]:=true;
22for j:=1
to n do
23if
not(f[j])and(s1[pos]+a[pos,j]then
24 s1[j]:=s1[pos]+a[pos,j];
25end
; 26
end;
27procedure
dijkstra1;
28var
i,j,min,pos:longint;
29begin
30 f[1]:=true;
31for i:=2
to n do
32begin
33 min:=maxlongint;
34 pos:=-1
; 35
for j:=1
to n do
36if
not(f[j])and(s2[j]then
37begin
38 min:=s2[j];
39 pos:=j;
40end
; 41
if pos=-1
then
42break;
43 f[pos]:=true;
44for j:=1
to n do
45if
not(f[j])and(s2[pos]+a[j,pos]then
46 s2[j]:=s2[pos]+a[j,pos];
47end
; 48
end;
49begin
50readln(n,m);
51for i:=1
to n do
52for j:=1
to n do
53 a[i,j]:=maxint+100000
; 54
for i:=2
to n do
55begin
56 s1[i]:=maxint+100000
; 57 s2[i]:=maxint+100000
; 58
end;
59for i:=1
to m do
60begin
61readln(u,v,w);
62if wthen
63 a[u,v]:=w;
64if (u=1)and(wthen
65 s1[v]:=w;
66if (v=1)and(wthen
67 s2[u]:=w;
68end
; 69
dijkstra;
70fillchar(f,sizeof(f),false);
71dijkstra1;
72for i:=2
to n do
73 ans:=ans+s1[i]+s2[i];
74writeln(ans);
75end.
郵遞員送信(luogu 1629)題解
有乙個郵遞員要送東西,郵局在節點1.他總共要送n 1樣東西,其目的地分別是2 n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有m條道路,通過每條道路需要一定的時間。這個郵遞員每次只能帶一樣東西。求送完這n 1樣東西並且最終回到郵局最少需要多少時間。5 10 2 3 5 1 5 5 3 ...
Luogu P1629 郵遞員送信
有乙個郵遞員要送東西,郵局在節點1.他總共要送n 1樣東西,其目的地分別是2 n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有m條道路,通過每條道路需要一定的時間。這個郵遞員每次只能帶一樣東西。求送完這n 1樣東西並且最終回到郵局最少需要多少時間。輸入格式 第一行包括兩個整數n和m。第...
郵遞員送信(洛谷1629)
傳送門 第一反應是floyd,但是看看資料規模,會tle 那就考慮n次單源最短路,但是即使是spfa,也會t 那肯定就另有玄機。我們每次出去送貨後都要直接返回郵局,所以我們需要的資訊是,從郵局到每一點的最短距離,和每一點到郵局的最短距離。無論是floyd還是n次單源最短路,都求了很多無用的資訊,即不...