首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

HDU 1863 通畅工程(kruskal算法)

2013-09-07 
HDU 1863畅通工程(kruskal算法)转载请注明出处:http://blog.csdn.net/a1dark分析:还是一道水水的最小生成

HDU 1863 畅通工程(kruskal算法)

转载请注明出处:http://blog.csdn.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;}


热点排行