并查集 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;
}

以上为此题的题解,第一次写,下次会努力的!!!!奋斗

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值