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