洛谷 P1629 郵遞員送信 最短路

2022-05-08 01:21:07 字數 1721 閱讀 3409

洛谷 p1629 郵遞員送信

演算法標籤:圖論最短路

有乙個郵遞員要送東西,郵局在節點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
這道題可以說很坑了,坑點就在於有向圖!!!我們可以發現按照題中描述我們需要從起始點先到某個點,在從某個點回到起始點,反覆迴圈。但是由於是有向圖,所以去的時候的最短路不一定就是回來時候的最短路,由於如果求n個點的最短路,或者多源單點最短路,時間上是承受不了的,所以這個問題成為整個題的難點所在,那麼怎麼處理???

大致的思路是這樣,把我們從起點(郵局)開始的一邊最短路定為正向,那麼我們回來就相當於一次反向求最短路。

按照我們正常想法是從n個點向起始點都跑一遍最短路(是不是想起了floyd),那麼加入我們反向建圖,這就變成了從起始點向n個重點跑最短路,就又變成了另外一組單源最短路,在時間上是可以接受的。

因為半死不活的spfa演算法和它(在不穩定方面)極為優秀的時間複雜度,個人放棄了這個演算法,所以沒有寫spfa的題解(從題目中m的資料範圍就放棄了),正常使用堆優化dijkstra,**如下:

#include using namespace std;

const int n = 1010;

const int m = 100100;

int n, m, ans, vis[n], dis[n], fvis[n], fdis[n];

int tot, to[m], nex[m], val[m], head[n];

int ftot, fto[m], fnex[m], fval[m], fhead[n];

void add(int x, int y, int z)

priority_queue < pair> q;

void dijkstra(int s)

} }}void fdijkstra(int s)

} }} int main()

dijkstra(1);

fdijkstra(1);

for (int i = 2; i <= n; i ++ )

printf("%d\n", ans);

return 0;

}

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