点击打开链接
4 1 2 3 4 5 6 1 6
#include
#include
#include
#include
using namespace std;
#define maxn 100010
int par[maxn],num[maxn],sum[maxn];
void init()
{
for(int i=1;i<=maxn;i++)
{
par[i]=i;
num[i]=1;
}
}
int find(int x)
{ if(x!=par[x])
par[x]=find(par[x]);
return par[x];
}
void unite(int a,int b)
{
int fa=find(a);
int fb=find(b);
if(fa!=fb)
{
par[fa]=fb;
}
}
int main()
{int n,a,b;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
printf("%d\n",1);
else{
init();
int max=0;
while(n--)
{
scanf("%d%d",&a,&b);
if(a>max)
max=a;
if(b>max)
max=b;
unite(a,b);
}
memset(sum,0,sizeof(sum));
for(int i=1;i<=max;i++)
sum[find(i)]++;
int max1=0;
for(int i=1;i<=max;i++)
{
if(sum[find(i)]>max1)
max1=sum[find(i)];
}
printf("%d\n",max1);
}
}
return 0;
}
4
2
Hint
A and B are friends(direct or indirect), B and C are friends(direct or indirect), then A and C are also friends(indirect). In the first sample {1,2,5,6} is the result. In the second sample {1,2},{3,4},{5,6},{7,8} are four kinds of answers.
分析:平时有时候会让求集合(畅通工程题),而本题用并查集求得每个集合的元素的个数,最后输出最大的集合的元素个数;
代码:
#include
#include
#include
#include
using namespace std;
#define maxn 100010
int par[maxn],num[maxn],sum[maxn];
void init()
{
for(int i=1;i<=maxn;i++)
{
par[i]=i;
num[i]=1;
}
}
int find(int x)
{ if(x!=par[x])
par[x]=find(par[x]);
return par[x];
}
void unite(int a,int b)
{
int fa=find(a);
int fb=find(b);
if(fa!=fb)
{
par[fa]=fb;
}
}
int main()
{int n,a,b;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
printf("%d\n",1);
else{
init();
int max=0;
while(n--)
{
scanf("%d%d",&a,&b);
if(a>max)
max=a;
if(b>max)
max=b;
unite(a,b);
}
memset(sum,0,sizeof(sum));
for(int i=1;i<=max;i++)//统计各个集合的个数
sum[find(i)]++;
int max1=0;
for(int i=1;i<=max;i++)
{
if(sum[find(i)]>max1)
max1=sum[find(i)];
}
printf("%d\n",max1);
}
}
return 0;
}