hdu1856依旧并查集
不过这个求的是最大集合的个数
#include<iostream>
#include<set>
#include<cstdio>
#include<vector>
using namespace std;
const int MAXN=10000005;
const int MAXM=100005;
int u[MAXN];
int sum[MAXN];
set<int>num;
//bool seted[MAXN];
int find(int p)
{
if(u[p]==p)
{
// seted[p]=1;
return p;
}else
{
// seted[p]=1;
return u[p]=find(u[p]);
}
}
void connect(int a,int b)
{
int f1=find(a);
int f2=find(b);
if(f1<f2)
{
u[f2]=f1;
}else
{
u[f1]=f2;
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int max=1;
int i=0;
num.clear();
vector<int>input[2];
input[0].clear();
input[1].clear();
//memset(seted,0,sizeof(seted));
for(i=0;i<=n-1;i++)
{
int num1,num2;
scanf("%d%d",&num1,&num2);
num.insert(num1);
num.insert(num2);
input[0].push_back(num1);
input[1].push_back(num2);
}
set<int>::reverse_iterator cp=num.rbegin();
for(cp=num.rbegin();cp!=num.rend();cp++)
{
u[*cp]=*cp;
sum[*cp]=0;
}
//memset(sum,0,sizeof(sum));
for(i=0;i<=n-1;i++)
{
connect(input[0][i],input[1][i]);
}
for(cp=num.rbegin();cp!=num.rend();cp++)
{
sum[find(*cp)]++;
}
for(cp=num.rbegin();cp!=num.rend();cp++)
{
if(sum[*cp]>max)
{
max=sum[*cp];
}
}
printf("%d\n",max);
}
return 0;
}
本博客(http://www.cnblogs.com/cj695/)未标明转载的内容均为本站原创,非商业用途转载时请署名(77695)并注明来源(http://www.cnblogs.com/cj695/)。商业用途请联系作者(77695) QQ:646710030。作者(77695)保留本博客所有内容的一切权利。
独立博客:http://nfeng.cc/
独立博客:http://nfeng.cc/

浙公网安备 33010602011771号