HDU 1863 通畅工程(kruskal算法)

HDU 1863 畅通工程(kruskal算法)

转载请注明出处:http://blog.****.net/a1dark

分析:还是一道水水的最小生成树、改了一点条件而已、代码基本不变、继续水、

#include<stdio.h>
#include<algorithm>
using namespace std;
struct node{
    int s,e;
    int val;
}flag[150];
int map[150];
int n,m,temp;
int cmp(node a,node b){
    if(a.val<b.val)
        return 1;
    else return 0;
}
void init(){
    for(int i=1;i<=m;i++)
        map[i]=i;
}
int find(int x){
    int r=x;
    while(r!=map[r])
        r=map[r];
    int b=x;
    int f;
    while(b!=r){
        f=map[b];
        map[b]=r;
        b=f;
    }
    return r;
}
int merge(int x,int y){
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy){
        map[fx]=fy;
        temp--;
        return 1;
    }
    return 0;
}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        if(n==0)break;
        for(int i=0;i<n;i++){
            scanf("%d%d%d",&flag[i].s,&flag[i].e,&flag[i].val);
        }
        sort(flag,flag+n,cmp);
        int sum=0,ans=0;
        temp=m-1;
        init();
        for(int i=0;i<n;i++){
            ans=merge(flag[i].s,flag[i].e);
            if(ans)
                sum+=flag[i].val;
        }
        if(temp>0)
            printf("?\n");
        else
            printf("%d\n",sum);
    }
    return 0;
}