郵遞員送信(洛谷1629)

2021-10-07 10:45:21 字數 1114 閱讀 8554

傳送門

第一反應是floyd,但是看看資料規模,會tle

那就考慮n次單源最短路,但是即使是spfa,也會t

那肯定就另有玄機。

我們每次出去送貨後都要直接返回郵局,所以我們需要的資訊是,從郵局到每一點的最短距離,和每一點到郵局的最短距離。無論是floyd還是n次單源最短路,都求了很多無用的資訊,即不同目的地之間的最短路,那是我們不需要的。這就會浪費時間。

所以我們應該怎麼精確地求出自己所需要的資訊呢?我們會發現無論是從郵局出去還是從外面回郵局,都有乙個核心的匯聚點就是郵局,其實這就是兩個單源最短路,乙個是正的,乙個是反的,所以我們只需要在建圖時建造兩張圖,一張是正的,一張是反的,然後兩邊spfa即可。

**如下:

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1005

;struct edge};

int n,m;

int d1[maxn]

;int inq[maxn]

,cnt[maxn]

;vector edge;

vector<

int> g[maxn]

;queue<

int> q;

void

bellmanford

(int s)}}

}}}int d2[maxn]

;vector edge1;

vector<

int> g1[maxn]

;void

antibellmanford

(int s)}}

}}}int

main()

bellmanford(1

);antibellmanford(1

);int ans=0;

for(

int i=

2;i<=n;i++

)printf

("%d"

,ans)

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