hdu1213-How Many Tables---基础并查集

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1213

题目大意:

今天是Ignatius的生日,他邀请了许多朋友。现在是吃晚饭的时间,Ignatius想知道他至少需要准备多少桌。必须注意的是,并非所有的朋友都相互认识对方,有的人不愿意和陌生人坐在一桌。针对此问题的一个重要的规则是,如果我告诉你A知道B,B知道C,这意味着,A和C认识对方,这样他们就可以留在一个桌子。但是如果我告诉你,A知道B,B知道C,D知道E,那么ABC可以坐在一起,DE就得另外再坐一桌了。你的任务是请根据输入的朋友之间的关系,帮助Ignatius 求出需要安排多少桌。

解题思路:

直接并查集判断有多少个连通块即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int T, n, m;
 4 const int maxn = 1000 + 10;
 5 int p[maxn];
 6 void init()
 7 {
 8     for(int i = 0; i <= n; i++)p[i] = i;
 9 }
10 int Find(int x)
11 {
12     return x == p[x] ? x : p[x] = Find(p[x]);
13 }
14 int main()
15 {
16     cin >> T;
17     while(T--)
18     {
19         cin >> n >> m;
20         init();
21         set<int>s;
22         int x, y;
23         while(m--)
24         {
25             cin >> x >> y;
26             x = Find(x);
27             y = Find(y);
28             if(x != y)
29             {
30                 p[x] = y;
31             }
32         }
33         for(int i = 1; i <= n; i++)s.insert(Find(i));
34         cout<<s.size()<<endl;
35     }
36     return 0;
37 }

 

转载于:https://www.cnblogs.com/fzl194/p/8898088.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值