郵遞員送信(luogu 1629)題解

2021-07-09 09:34:38 字數 3051 閱讀 6189

【問題描述】

有乙個郵遞員要送東西,郵局在節點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,便於觀察),如果實在不行的話那就只能用鄰接表了,願意用鄰接表的用鄰接表也可以。(自我感覺不願意去寫……)

1

var 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次單源最短路,都求了很多無用的資訊,即不...