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

Posted zquzjx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
",ans);
        if(cnt==n-1) break;
    }
    printf("%d
",ans+mina);

    return 0;
}
View Code

 

以上是关于USACO 2008 November Gold Cheering up the Cows /// MST oj24381的主要内容,如果未能解决你的问题,请参考以下文章

USACO 2006 November Gold Corn Fields /// 状压 oj23941

[usaco2008feb_gold]路面修整

POJ3659 [usaco2008jan_gold]电话网络

暑期USACO囤题计划

BZOJ 1589 Trick or Treat on the Farm (tarjan缩点,记忆化搜索)[Usaco 2008 Dec Gold]BZOJ计划

BZOJ 1589 Trick or Treat on the Farm (tarjan缩点,记忆化搜索)[Usaco 2008 Dec Gold]BZOJ计划