洛谷P1629 郵遞員送信

2022-03-04 22:31:04 字數 1566 閱讀 2656

題目戳

題目描述

有乙個郵遞員要送東西,郵局在節點1.他總共要送n-1樣東西,其目的地分別是2~n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有m條道路,通過每條道路需要一定的時間。這個郵遞員每次只能帶一樣東西。求送完這n-1樣東西並且最終回到郵局最少需要多少時間。

輸入輸出格式

輸入格式:

第一行包括兩個整數n和m。

第2到第m+1行,每行三個數字u、v、w,表示從a到b有一條需要w時間的道路。 滿足1<=u,v<=n,1<=w<=10000,輸入保證任意兩點都能互相到達。

【資料規模】

對於30%的資料,有1≤n≤200;

對於100%的資料,有1≤n≤1000,1≤m≤100000。

輸出格式:

輸出僅一行,包含乙個整數,為最少需要的時間。

輸入輸出樣例

輸入樣例#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

輸出樣例#1:

83題意很簡單,在乙個有向圖中,就是求從1點出發求到其它所有點的最短路再從那些點回到1點的最短路的長度和。怎麼做呢?最簡單的做法是floyd,可以水40分左右吧,正解是堆優化的dijkstra或者直接兩遍spfa。我這裡選擇的是spfa(說實話dijkstra我還真不熟悉),思路就無非是先從1點跑一遍spfa求出到其它點的最短路,再反向建邊(開始建圖的時候就可以直接處理)跑一遍spfa就能求出其它點到1點的最短路,最後累加得到的dis值就ok了。

1 #include2

using

namespace

std;

3#define il inline

4#define ll long long

5#define inf 233333333

6int n,m,h1[1005],h2[1005],dis1[1005],dis2[1005

],cnt;

7bool vis[1005];8

struct

edgee1[100005],e2[100005

];11 il void add(int u,int v,int

w)12

16 il void spfa1(int

s)1729}

30}31}

32 il void spfa2(int

s)3345}

46}47}

48int

main()

4957 spfa1(1

);58 spfa2(1

);59 ll ans=0;60

for(int i=1;i<=n;i++)ans+=dis1[i]+dis2[i];

61 cout<62return0;

63 }

洛谷 P1629 郵遞員送信

題目大意 求乙個郵遞員把信分別送到2 n的最短路,與他回到節點的最短路之和。dijkstra 題目是無向圖並且要求求出來回最短路之和。2.用dijkstra求1到其它點的最短路,再將每條邊反向再求一次1到其它點的最短路,然後相加。時間複雜度 o n 2 var m array 0.1001 of b...

洛谷P1629 郵遞員送信

有乙個郵遞員要送東西,郵局在節點1.他總共要送n 1樣東西,其目的地分別是2 n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有m條道路,通過每條道路需要一定的時間。這個郵遞員每次只能帶一樣東西。求送完這n 1樣東西並且最終回到郵局最少需要多少時間。輸入格式 第一行包括兩個整數n和m。第...

洛谷 P1629 郵遞員送信

這個裡面判斷的東西比較多 實際上不需要這麼多的,資料給的很水 完全可以加上重邊自環什麼的 而且這道題完全暴力做n次dij 3 10 7比較危險 比較優化的方法是 第一遍dij算出郵遞員到每個地方的距離 第二遍反向建邊,橫容易看出郵遞員到每個地方的距離都是每個地方到郵遞員的距離 這種方法就可以把單終點...