zoukankan      html  css  js  c++  java
  • uva 10608 Friends 并查集

    /*
    
    题目:
        n个人中有m对人互为朋友,若a认识b,b认识c,则a认识c,问这n个人中最多有多少人
        相互认识
    
    分析:
        并查集实现,把互为朋友的放置在同一集合中,询问最大人数时可以使用计数器计算该
        人所在集合的父节点的数字
    
    */
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    const int X = 30002;
    
    int p[X],cnt[X],n,m;
    
    int find_set(int x)
    {
        if(x!=p[x])
            p[x] = find_set(p[x]);
        return p[x];
    }
    
    int main()
    {
        freopen("sum.in","r",stdin);
        freopen("sum.out","w",stdout);
        int t,x,y;
        cin>>t;
        while(t--)
        {
            memset(cnt,0,sizeof(cnt));
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)
                p[i] = i;
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d",&x,&y);
                x = find_set(x);
                y = find_set(y);
                if(x!=y)
                    p[y] = x;
            }
            for(int i=1;i<=n;i++)
            {
                x = find_set(i);
                cnt[x]++;
            }
            int ans = 0;
            for(int i=1;i<=n;i++)
                ans = max(cnt[i],ans);
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    CF991D Bishwock
    CF1010D Mars rover
    NOIP 2011 计算系数
    SDOI 2008 仪仗队
    浅谈欧拉函数
    CF1249F Maximum Weight Subset
    NOIP 2011 铺地毯
    CF707D Persistent Bookcase
    C++ STL bitset 容器详解
    CF798D Mike and distribution
  • 原文地址:https://www.cnblogs.com/yejinru/p/2549900.html
Copyright © 2011-2022 走看看