USACO 2008 November Gold Cheering up the Cows /// MST oj24381
阿新 • • 發佈:2018-07-10
operator 一個 技術 -- def oot lap mina https
題目大意:
輸入n,p;n個點,p條路
接下來n行輸入c[];在各個點需要花費的時間
接下來p行輸入u,v,w;u點到v點的路需要花費時間w
求經過所有點且最後回到起點的最少花費時間
https://blog.csdn.net/HY_VFenux/article/details/68954199
將每條邊的權值存為 路徑花費*2+兩端點花費
Kruscal求MST 最後加上開始位於起點的花費 即各個點中最少花費的一個
#include <bits/stdc++.h> #define INF 0x3f3f3f3f #define N 10005 #define P 100005 using namespaceView Codestd; int n,m,a[N],root[N]; struct NODE { int n,t,c; bool operator <(const NODE& b) const{ return c<b.c; } }no[P]; int getroot(int man) { if(root[man]==man) return man; return root[man]=getroot(root[man]); } int main() { scanf("%d%d",&n,&m); int mina=INF;for(int i=1;i<=n;i++) { scanf("%d",&a[i]); root[i]=i; mina=min(mina,a[i]); } int len=0; while(m--) { int u,v,w; scanf("%d%d%d",&u,&v,&w); no[len++]={u,v,2*w+a[u]+a[v]}; } sort(no,no+len); int cnt=0, ans=0; for(int i=0;i<len;i++) {int u=no[i].n, v=no[i].t, w=no[i].c; int ru=getroot(u), rv=getroot(v); if(ru!=rv){ root[rv]=ru; cnt++; ans+=w; }//printf("%d\n",ans); if(cnt==n-1) break; } printf("%d\n",ans+mina); return 0; }
USACO 2008 November Gold Cheering up the Cows /// MST oj24381