zoukankan      html  css  js  c++  java
  • hdu 1879 继续畅通工程 (并查集)

    #include<stdio.h>
    #include<string.h>
    int map[105][105],vis[105][105],ans,n,father[105];
    int find(int x)
    {
        while(x!=father[x])
            x=father[x];
        return x;
    }
    int main()
    {
        int i,j,k,a,b,d,t,min1,min2,state,tt,num;
        while(scanf("%d",&n)==1 && n)
        {
            memset(vis,0,sizeof(vis));
            memset(map,0,sizeof(map));
            t=n*(n-1)/2;num=n;ans=0;
            for(i=1;i<=n;i++)
                father[i]=i;
            for(i=0;i<t;i++)
            {
                scanf("%d%d%d%d",&a,&b,&d,&state);
                if(a<b) map[a][b]=d;
                else map[b][a]=d;
                if(state) 
                {
                    if(a<b) vis[a][b]=1;
                    else vis[b][a]=1;
                    a=find(a);b=find(b);
                    if(a!=b)
                    {
                        if(a>b) father[a]=b;
                        else father[b]=a;
                        num--;
                    }
                }
            }
            if(num==1)
            {
                printf("0\n");continue;
            }
            for(k=1;k<n;k++)
            {
                tt=1;
                for(i=1;i<n;i++)
                {
                    for(j=i+1;j<=n;j++)
                    {
                        a=find(i);b=find(j);
                        if(vis[i][j]==0 && a!=b)
                        {
                            if(tt)
                            {
                                min1=i;min2=j;tt=0;
                            }
                            else if(map[min1][min2]>map[i][j])
                            {
                                min1=i;min2=j;
                            }
                        }
                    }
                }
                ans+=map[min1][min2];num--;vis[min1][min2]=1;
                min1=find(min1);min2=find(min2);
                if(min1>min2) father[min1]=min2;
                else father[min2]=min1;
                if(num==1) break;
            }
            printf("%d\n",ans);
        }
        return 0;
    }

  • 相关阅读:
    Hyperledger Fabric的容灾备份及恢复方法
    Sentinel使用
    Fabric1.4 架构和原理
    centos开放指定端口
    Python使用ProtoBuffer
    C++动态创建对象
    Shell笔记
    Go语言基础(二)
    Go语言基础(一)
    git常用命令
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218216.html
Copyright © 2011-2022 走看看