题目意思大概是说:输入一个N,然后输入N行,每行的一对数是好朋友,他们可以站在一起,最后让求的是每一组中人数的最大值
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int s[100001],x[100001],y[100001];
int u[200001],v[200001],vis[200000];
int n,maxx,a,b,cnt=1;
int find(int x)
{
return s[x]==x?x:s[x]=find(s[x]);
}
void merger(int x, int y){
int f1=find(s[x]);
int f2=find(s[y]);
if(f1!=f2)
s[f2]=f1;
}
int ss(int x){
int high=cnt-1,low=0,mid;
while(low<=high){
mid=(low+high)>>1;
if(v[mid]==x)return mid;
else if(v[mid]<x)low=mid+1;
else high=mid-1;
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
while(cin>>n){
cnt=1;
for(int i=0;i<n;i++){
cin>>x[i]>>y[i];
u[2*i]=x[i];
u[2*i+1]=y[i];
}
sort(u,u+2*n);
v[0]=u[0];
for(int i=1;i<2*n;i++){
if(u[i]!=u[i-1]){
v[cnt++]=u[i];
}
}
for(int i=0;i<cnt;i++)s[i]=i;
for(int i=0;i<n;i++){
a=ss(x[i]);
b=ss(y[i]);
merger(a,b);
}
memset(vis,0,sizeof(vis));
maxx=-1;
for(int i=0;i<cnt;i++){
int p=find(s[i]);
vis[p]++;
if(maxx<vis[p])
maxx=vis[p];
}
cout<<maxx<<endl;
}
return 0;
}