hdu1879——继续畅通工程——————【kruskal模板】

来源:互联网 发布:程序员 英文面试 编辑:程序博客网 时间:2024/06/05 20:56
以前写过这道题不止一遍,但是再碰到这个题目的时候还是迷茫,长时间不练习这方面的题目就不会了,看来真的需要坚持码代码,不写会生疏的!
#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>using namespace std;//最小生成树,拓扑排序,最短路径,二分图,网络流。const int N=110;int father[N*N];struct node {    int st_p;   //左端    int en_p;   //右端    int cost;   //边长}edge[N*N];void init(){    for(int i=0;i<N;i++){        father[i]=i;    }}int find(int x){    if(father[x]==x){        return x;    }    else{        return father[x]=find(father[x]);    }}void Union(int x,int y){    x=find(x),y=find(y);    if(x!=y){        if(x<y){            father[y]=x;        }        else            father[x]=y;    }}bool cmp(node a,node b){    return a.cost<b.cost;}int kruskal(int k){    int x,y,ans=0;    sort(edge,edge+k,cmp);    for(int i=0;i<k;i++){        x=edge[i].st_p;        y=edge[i].en_p;        x=find(x),y=find(y);        if(x!=y){            if(x>y){                father[x]=y;            }            else{                father[y]=x;            }            ans+=edge[i].cost;        }    }    return ans;}int main(){    int n,m,a,c,b,d;    while(scanf("%d",&n)!=EOF&&n){        init();        m=n*(n-1)/2;        int k=0;        for(int i=0;i<m;i++){            scanf("%d%d%d%d",&a,&b,&c,&d);            if(d==1){                Union(a,b);                continue;            }            edge[k].st_p=a;            edge[k].en_p=b;            edge[k++].cost=c;           }        int ans=kruskal(k);        printf("%d\n",ans);    }    return 0;}

0 0
原创粉丝点击