码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-07-09 22:26:48      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:alt   bre   efi   col   技术分享   root   fine   scan   splay   

题目大意:

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

标签:alt   bre   efi   col   技术分享   root   fine   scan   splay   

原文地址:https://www.cnblogs.com/zquzjx/p/9286381.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!