Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18146 Accepted Submission(s): 8936
2 5 3 1 2 2 3 4 5 5 1 2 5
2 4
这是考察并查集的一道题。首先输入一个数代表测试案例的个数,然后输入n和m分别代表亲戚的总数和关系的总数,后面跟上m行,每行输入两个数,说明这两个数之间有关系,也就是这两个数的根相同,通过并查集的方法看看有多少个树根就有多少桌,具体做法看代码:
#include <stdio.h>
#define max 1005
int pre[max];
int n,m;
void init()
{
for(int i=1;i<=n;i++)
pre[i]=i;
}
int find(int x)
{
int r=x;
while(r!=pre[r])
r=pre[r];
int i,j;
i=x;
while(i!=r)
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void jion(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
pre[fx]=fy;
}
int main()
{
int a,b;
int N;
scanf("%d",&N);
while(N--)
{
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
jion(a,b);
}
int s=0;
for(int i=1;i<=n;i++)
{
if(i==pre[i])
s++;
}
printf("%d\n",s);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/dxx_111/article/details/47133071