POJ2387 Til the Cows Come Home (Kruscal)

题目链接>>>

题目大意:

谷仓之间有一些路径长度,然后要在这些谷仓之间建立一些互联网,花费的成本与长度成正比,,并且要使这些边连起来看的像一课“树”,然后使成本最大

解题思路:

最大生成树
用kruskal在最小生成树的基础上,将排序从大到小排序,这样就是一个最大生成树了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

struct EDGE{
    int x,y;
    long long c;
}edge[30000];
int father[1010];
int n,m;

bool cmp(EDGE a,EDGE b){
    return a.c>b.c;
}
int find(int x){
    if(father[x]==x)return x;
    father[x]=find(father[x]);
    return father[x];
}
void Kruskal(){
    long long sum=0,s=0;
    sort(edge+1,edge+1+m,cmp);
    for(int i=1;i<=m;i++){
        int f1=find(edge[i].x);
        int f2=find(edge[i].y);
        if(f1!=f2){
            father[f2]=f1;
            sum+=edge[i].c;
            s++;
        }    
        if(s==n-1)break;
    }
    if(s==n-1)printf("%lld\n",sum);
    else printf("-1\n");
}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=1;i<=n;i++)father[i]=i;
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].c);
        }
        Kruskal();
    }
    return 0;
}

 

2018-04-01

 

posted @ 2018-04-01 19:24  悠悠呦~  阅读(146)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end