找出最大的并查集

王先生想要一些男孩帮助他做一个项目。因为项目比较复杂,男生来的越多越好。当然也有一定的要求。  王先生选了一个足够容纳男孩子的房间。没有被选中的男孩必须立即离开房间。房间里一开始就有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;
  }
}

上一篇:axios 一次请求多个接口


下一篇:P5268 一个简单的询问(莫队+容斥)