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

题目大意:

输入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

猜你喜欢

转载自www.cnblogs.com/zquzjx/p/9286381.html
今日推荐