ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

找出最大的并查集

2021-12-19 12:04:01  阅读:121  来源: 互联网

标签:找出 最大 r2 int 查集 father num find r1


王先生想要一些男孩帮助他做一个项目。因为项目比较复杂,男生来的越多越好。当然也有一定的要求。  王先生选了一个足够容纳男孩子的房间。没有被选中的男孩必须立即离开房间。房间里一开始就有1000万男孩,编号从1到1000万。王先生选了以后,在这间屋子里的任何两个都应该是朋友(直接或间接),否则就只剩下一个男孩了。鉴于所有直接的朋友对,您应该决定最佳方式。 输入 输入的第一行包含一个整数 n (0 ≤ n ≤ 100 000) - 直接朋友对的数量。以下 n 行每行包含一对数字 A 和 B,由一个空格分隔,表明 A 和 B 是直接朋友。(A≠B,1≤A,B≤10000000) 输出 一行中的输出正好包含一个整数,等于王先生可以保留的最大男孩数。

样本输入

4

1 2

3 4

5 6

1 6

4

1 2

3 4

5 6

7 8

样本输出

4 2

#include<bits/stdc++.h>
using namespace std;
int father[10000001];
int num[10000001];
int find(int x)
{
  if(father[x]!=x) father[x]=find(father[x]);
  else return father[x];
}
int main()
{
  int m;
  while((scanf("%d",&m))!=EOF)
  {    int maxn=1;
    for(int i=1;i<=10000000;i++)
    {
      father[i]=i;num[i]=1;
    }
    for(int i=1;i<=m;i++)
    {
      int x,y;
      scanf("%d%d",&x,&y);
      int r1=find(x);
      int r2=find(y);
      if(r1!=r2)
      {
       father[r2]=r1;
       num[r1]+=num[r2];
       if(maxn<num[r1])maxn=num[r1];//优化,在合并时比较
      }
    }
    cout<<maxn<<endl;
  }
}

标签:找出,最大,r2,int,查集,father,num,find,r1
来源: https://www.cnblogs.com/yingboyoyo/p/15706960.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有