4 28 洛谷 P1629 郵遞員送信

2021-10-05 15:29:38 字數 1493 閱讀 5221

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

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

正常使用dirskra最短路徑遍歷所有邊更新起點到其他點的距離。但是因為本題還需要求返回起點的最短路徑,並且因為邊是單向的,不能原路返回,所以建議使用反向圖,再求一下起點到各點的最短路徑,既各點到起點的最短路徑;

**如下,詳見注釋:

#include

#include

#define max 1005

using

namespace std;

int dis[max]

, drs[max]

, sum=0;

//兩個陣列乙個存初始點到其他點的最短距離,乙個存其他點到初始點的距離;

int u[max*

100]

, v[max*

100]

, w[max*

100]

;//注意陣列大小,後面我才注意到是10^5,結果只有30分,卡了我賊久;

int n, m, s, check, b1=

1, b2=1;

//check用來檢查dis和drs是否更新完;

const

int inf=

0x3f3f3f3f

;int

main()

}if(check==

0) b1=0;

check =0;

//記得重新設定check的值;

if(b2)

for(

int i=

1;i<=m;i++

)//求drs的過程相當於反向求初始點到各點的過程; }if

(check==

0) b2=0;

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

//

for(

int i=

2;i<=n;i++

) sum +

= dis[i]

+drs[i]

;//dis和drs求和;

cout << sum << endl;

return0;

}

蒟蒻乙隻,歡迎指正

洛谷 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算出郵遞員到每個地方的距離 第二遍反向建邊,橫容易看出郵遞員到每個地方的距離都是每個地方到郵遞員的距離 這種方法就可以把單終點...