HDOH 1879 Kruskal算法

来源:互联网 发布:编程珠玑 英文版 pdf 编辑:程序博客网 时间:2024/06/05 07:00
#include"iostream"#include"algorithm"using namespace std;const int maxn=5000;int pre[maxn];int rk[maxn];void init(int n){    for(int i=1;i<=n;i++)    {        rk[i]=0;        pre[i]=i;    }}int find(int x){    return pre[x]==x?x:pre[x]=find(pre[x]);}bool join(int x,int y){    x=find(x);    y=find(y);    if(x!=y)    {        if(rk[x]==rk[y])        {            pre[y]=x;            rk[x]++;        }        else if(rk[x]<rk[y])            pre[x]=y;        else             pre[y]=x;        return true;    }    return false;}struct road{    int u,v,w,flag;}r[maxn];bool cmp(road a,road b){    return a.w<b.w;}int main(){    //freopen("a.txt","r",stdin);    int n;    while(cin>>n,n)    {        int count=0;        init(n);        for(int i=0;i<n*(n-1)/2;i++)        {            scanf("%d%d%d%d",&r[i].u,&r[i].v,&r[i].w,&r[i].flag);            if(r[i].flag)            {                join(r[i].u,r[i].v);                count++;            }        }        sort(r,r+n*(n-1)/2,cmp);        int ans=0;        for(int i=0;i<n*(n-1)/2;i++)        {            int s=r[i].w;            if(join(r[i].u,r[i].v)){                count++;                ans+=s;            }            if(count==n-1)                break;        }        if(count==n-1)            cout<<ans<<endl;    }    return 0;}

G
0 0
原创粉丝点击