1. 程式人生 > >USACO 2008 November Gold Cheering up the Cows /// MST oj24381

USACO 2008 November Gold Cheering up the Cows /// MST oj24381

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 namespace
std; 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; }
View Code

USACO 2008 November Gold Cheering up the Cows /// MST oj24381