并查集 Table问题

加入科协acm组,到现在已经过去一周了,在组里看着其他的组员,认识到了自己的不足,也参加了外校的校acm竞赛,虽然只是纯打酱油的..【捂脸…】今天是我第一次写博客,第一次为了A过的题写题解,竟有一丝小激动…今天要说的题,是一个逗比学长【PS:绝对不能让他看见这个博客…】在寒假讲过的一道题,当时只是在他给的其他题的模板上添加了个循环就做出来了,这次是自己重新敲出来的,感觉棒棒的!

题目:今天是某某的生日,他邀请了很多的朋友,现在是吃晚饭的时间了。他想知道他需要至少有多少桌子,你要注意,并不是所有的朋友彼此了解,所有的朋友不想和陌生人呆在一起。
这个问题的一个重要的规则是,如果我告诉你A认识B,C和B认识,这意味着A,B,C认识彼此,所以他们可以在一个桌子。
例如:如果我告诉你A认识B,B认识C和D认识E,所以A,B,C可以呆在一个桌子,和D,E必须呆在另一个。所以某某需要至少2桌子。

输入:输入从一个整数T(1 < = T < = 25),显示测试用例的数量。然后遵循T测试用例。每个测试用例开始于两个整数N和M(1 < = N,M < = 1000)。N表示数量的朋友,然后朋友都标志着从1到N . M线跟进。每一行包含两个整数A和B(一个! = B),这意味着朋友和朋友互相了解。两个数据之间有一个空格。

输出:为每个测试用例,输出至少需要多少桌子。不打印任何空白。

例:输入: 

2
5 3
1 2
2 3
4 5

5 1
2 5

输出:

2


我的结题报告如下:

#include<stdio.h>
int a[1003];
void merge(int x,int y)    /*   合并操作  */
{
a[x]=y;
}
int find(int x)  
{
if(x!=a[x])
a[x]=find(a[x]);
return a[x];
}
int main()
{
int  t,n,m,i,j,x,y;
scanf(“%d”,&t);
while(t–)
{
scanf(“%d%d”,&n,&m);
j=0;
for(i=1;i<=n;i++)
a[i]=i;
for(i=1;i<=m;i++)
{
scanf(“%d%d”,&x,&y);
x=find(x);
y=find(y);
merge(x,y);
}
for(i=1;i<=n;i++)
if(a[i]==i)
j++;
printf(“%d\n”,j);
}
return 0;
}

以上为此题的题解,第一次写,下次会努力的!!!!《并查集 Table问题》

    原文作者:犯罪团伙问题
    原文地址: https://blog.csdn.net/fragle_spume/article/details/44755457
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞