zoukankan      html  css  js  c++  java
  • More is better(并查集)

    #include<stdio.h>
    #include<string.h>
    const int MAXN=10000010;
    int father[MAXN],hash[MAXN];
    
    void Make_set()
    {
        for(int i=0;i<MAXN;i++)
        {
            father[i]=i;
            //rank[i]=0;
        }
    }
    
    int Find(int x)
    {
        int r=x;
        while(r!=father[r])
        {
            r=father[r];
        }
        if(r!=x) father[x]=r;
        return father[x];
    }
    
    void Union(int x,int y)
    {
        if(x==y) return ;
       /* if(rank[x]>rank[y]) father[y]=x;
        else
        {
            if(rank[x]==rank[y])
            {
                rank[y]++;
            }
            father[x]=y;
        }*/
        father[x]=y;
    }
    
    int main()
    {
        int T,i,n,a,b;
        while(scanf("%d",&n)!=EOF)
        {
            memset(hash,0,sizeof(hash));
            Make_set();
            for(i=0;i<n;i++)
            {
                scanf("%d%d",&a,&b);
                int x=Find(a);
                int y=Find(b);
                Union(x,y);
            }
            int mx=0;
            for(i=1;i<MAXN;i++)
            {
                hash[Find(father[i])]++;
            }
            for(i=1;i<MAXN;i++)
            {
                if(mx<hash[i]) mx=hash[i];
            }
            printf("%d\n",mx);
        }
        return 0;
    }
    #include <iostream>
    using namespace std;
    const int maxn=10000010;
    int    n;
    struct NODE
    {
        int root;
        int num;
    }nod[maxn];
    
    struct SEG
    {
        int u, v;
    }seg[100001];
    
    int u, v;
    int maxsum;
    
    int getfather(int r)
    {
        if(nod[r].root==-1)
        return r;
        int temp = nod[r].root;
        nod[r].root=getfather(temp);
        return nod[r].root;
    }
    
    void union_set(int r1, int r2)
    {
        int root1=getfather(r1);
        int root2=getfather(r2);
        nod[root1].root=root2;
        nod[root2].num += nod[root1].num;
        if(nod[root2].num>maxsum)
        {
            maxsum=nod[root2].num;
        }
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            maxsum=1;
            for (int i=1; i<=n; i++)
            {
                  scanf("%d %d",&seg[i].u, &seg[i].v);
                  nod[ seg[i].u ].root = -1;
                  nod[ seg[i].u ].num=1;
                  nod[ seg[i].v ].root =-1;
                  nod[ seg[i].v ].num = 1;
            }
            for (int i=1; i<=n; i++)
            {
                if(getfather(seg[i].u)!=getfather(seg[i].v))
                {
                    union_set(seg[i].u, seg[i].v);
                }
            }
            printf("%d\n", maxsum);
        }
        return 0;
    }
  • 相关阅读:
    Linux下Samba的配置
    NYoj-街区最短路径问题
    Merge into的使用具体解释-你Merge了没有
    c++11 stl atomic_flag 样例
    7个最好的免费杀毒软件下载
    关于PCA算法的一点学习总结
    linux查看硬件信息
    js php xmlrequest 上传图片
    BZOJ1827 [Usaco2010 Mar]gather 奶牛大集会
    只有小于65535端口编程可以用,查看哪些端口被打开netstat -anp,nc命令,nmap命令
  • 原文地址:https://www.cnblogs.com/zsboy/p/2626094.html
Copyright © 2011-2022 走看看