題目
dijkstra + 鏈式前向星 + 堆優化的題解。
這一題明顯是求最短路。與模板不同,它要求的是多源最短路,是每個節點到源點的距離。
這裡如果用暴力,或者每個節點求一遍,顯然在時間上是過不去的。(每個節點求一遍的堆優化的dijkstra是50分)
所以,就要用乙個重要的結論:逆圖中源點到各個點的最短路就是原圖中各個點到源點的最短路。
理解過程:
我們可以想象一下,在原圖中,n --> 1的最短路,如果在反向圖中不就是 n <-- 1 嗎?
有了這個結論,這道題就簡單多了:先求乙個原圖的最短路,再求乙個逆圖的最短路。這題就結束了。
附上**:
#include #define maxn 100005
#define inf 0x3f3f3f3f
struct edge //鏈式前向星
e[maxn],ne[maxn]; //原圖與逆圖
struct node //寫乙個堆的結構體
void init() //初始化
void dijkstra(edge e,int adj) //函式變數中記得帶上鄰接域
); while(!q.empty())
); }
} }}int main()
dijkstra(e,adj);
for(int i=1;i<=n;++i) ans+=dis[i];
dijkstra(ne,nadj);
for(int i=1;i<=n;++i) ans+=dis[i];
std::printf("%d",ans);
return 0;
}
P1629 郵遞員送信
有乙個郵遞員要送東西,郵局在節點 11。他總共要送 n 1n 1 樣東西,其目的地分別是節點 22 到節點 nn。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有 mm 條道路。這個郵遞員每次只能帶一樣東西,並且運送每件物品過後必須返回郵局。求送完這 n 1n 1 樣東西並且最終回到郵局最...
P1629 郵遞員送信
有乙個郵遞員要送東西,郵局在節點1.他總共要送n 1樣東西,其目的地分別是2 n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有m條道路,通過每條道路需要一定的時間。這個郵遞員每次只能帶一樣東西。求送完這n 1樣東西並且最終回到郵局最少需要多少時間。輸入格式 第一行包括兩個整數n和m。第...
題解 洛咕P1629 郵遞員送信
鏈結 乙個郵遞員要從一號點到每個點再回來,求最短路 題目說一次只能去乙個點,這樣就簡單了,求每個點最短路 怎麼求回來的最短路?每個點跑一次dijkstra?這樣會t 只要反向建邊,再求點1到各點的最短路不就行了嗎?可以畫個圖手算一遍 include include include include i...