2512: Groups
Result | TIME Limit | MEMORY Limit | Run Times | AC Times | JUDGE |
---|---|---|---|---|---|
![]() | 3s | 16384K | 452 | 121 | Standard |
将N个人分成M组,测试数据包含多组输入,每组输入第一行为两个整数N,T(1<=N<=10000),(1<=T<=10000),后面有T行输入,每行两个整数a,b(1<=a,b<=N),表示编号为a的人和编号为b的人在同一组中,根据已知条件求组数M至多为多少。
Sample Input
5 3 1 2 2 3 4 5 6 4 1 2 2 1 3 4 4 3
Sample Output
2 4
Problem Source: xwbsw
This problem is used for contest: 120
#include<iostream>
using namespace std;
int father[10005],n,t,rank[10005];
int find(int x)
{
if(father[x]!=x)
{
father[x]=find(father[x]);
}
return father[x];
}
void uion(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
{
if(rank[x]>rank[y])
{
father[y]=x;
}
else
{
if(rank[x]==rank[y])
{
rank[y]++;
}
father[x]=y;
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&t)==2)
{
for(i=1;i<=n;i++)
{
father[i]=i;
rank[i]=0;
}
for(int l=0;l<t;l++)
{
scanf("%d%d",&i,&j);
uion(i,j);
}
int countc=0;
for(i=1;i<=n;i++)
{
if(father[i]==i)
{
countc++;
}
}
cout<<countc<<endl;
}
return 0;
}