Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5629 Accepted Submission(s): 2662
One important rule for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table.
For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least.
//并查集模板题、刷水题练练手噢噢
#include <iostream>
#include <stdio.h>
#include <string.h>
#define N 1003
using namespace std;
int n;
int f[N],r[N];
int find_f(int x)
{
if(x!=f[x])
{
return f[x]=find_f(f[x]);
}
return x;
}
void union_set(int x,int y)
{
x=find_f(x);
y=find_f(y);
if(x==y) return;
n--;
if(r[x]>r[y])
f[y]=x;
else if(r[x]<r[y])
f[x]=y;
else
{
f[y]=x;
r[x]++;
}
}
int main()
{
int m;
int T;
int i,a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
f[i]=i,r[i]=0;
while(m--)
{
scanf("%d%d",&a,&b);
union_set(a,b);
}
printf("%d\n",n);
}
return 0;
}