【最小生成树】路线规划(nowcoder 217603)
生活随笔
收集整理的這篇文章主要介紹了
【最小生成树】路线规划(nowcoder 217603)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
路線規劃
nowcoder 217603
題目大意
給一個無向連通圖,問你在經過的邊最少的前提下,從1走過所有點,再走回1的最短距離
樣例#1
輸入樣例#1
5 5 5 4 3 4 3 5 2 3 7 1 2 4 2 4 1輸出樣例#1
26樣例解釋#1
最少時間的路徑:
1 →2 →4 →3 →4 →5 →4 →2 →1
1 →2 →4 →5 →4 →3 →4 →2 →1
樣例#2
輸入樣例#2
20 40 6 17 15 20 14 24 3 17 33 8 1 47 16 18 21 20 12 98 14 15 24 6 11 49 12 6 25 3 8 18 5 7 23 12 3 82 5 15 14 20 18 7 3 6 60 17 2 477 15 2 2 8 11 257 9 2 3 5 6 3 18 1 4 12 13 269 7 9 265 6 16 2 13 2 2 5 13 6 8 13 8 14 6 8 8 14 9 17 13 7 12 10 7 16 20 31 2 6 277 4 13 426 16 9 11 10 1 388 6 1 15 20 5 3 12 19 16 16 19 2輸出樣例#2
1192數據范圍
1?n?2×1051?m?2×1061?ai?263?11\leqslant n \leqslant 2\times 10^5\\1\leqslant m \leqslant 2\times 10^6\\1\leqslant a_i\leqslant 2^{63}-11?n?2×1051?m?2×1061?ai??263?1
解題思路
對于求出來的路線中,設從1到最后一個點的路徑為干線(如圖下圖,最后一個點為5,干線為1-2-3-5)
對于干線上的邊(如2-3),來回各會走兩遍
而對于非干線上的邊,在去的時候,要離開干線,再回到干線,共兩遍
而回來的時候不用走
所以無論是干線上的邊還是非干線上的邊,都會走兩遍
那么對該圖做最小生成樹,使得所有點都到過一遍,然后乘2即可
代碼
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; ll n, m, x, y, num, ans, fa[200021]; struct node {ll x, y, l; }a[2000021]; bool cmp(node a, node b) {return a.l < b.l; } ll find(ll x) {return x == fa[x]?x:fa[x] = find(fa[x]); } int main() {scanf("%lld%lld", &n, &m);for (ll i = 1; i <= m; ++i)scanf("%lld%lld%lld", &a[i].x, &a[i].y, &a[i].l);sort(a + 1, a + 1 + m, cmp);for (ll i = 1; i <= n; ++i)fa[i] = i;num = 1;for (ll i = 1; i <= m; ++i)//最小生成樹{x = find(a[i].x);y = find(a[i].y);if (x != y){num++;ans += a[i].l;//記錄邊權fa[x] = y;if (num == n) break;//這里要用num記錄一下,如果所有點都到過了,就直接退出,以減少時間,不然會T}}printf("%lld", ans * 2);return 0; }總結
以上是生活随笔為你收集整理的【最小生成树】路线规划(nowcoder 217603)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你见过哪些亚马逊的坑亚马逊都有哪些坑
- 下一篇: 电脑版微信聊天记录迁移方法微信如何转入电