HDU1213 How Many Tables 并查集
2016-07-24 16:32
429 查看
How Many Tables Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 14 Accepted Submission(s) : 12 Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not want to stay with strangers. 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. Input The input starts with an integer T(1<=T<=25) which indicate the number of test cases. Then T test cases follow. Each test case starts with two integers N and M(1<=N,M<=1000). N indicates the number of friends, the friends are marked from 1 to N. Then M lines follow. Each line consists of two integers A and B(A!=B), that means friend A and friend B know each other. There will be a blank line between two cases. Output For each test case, just output how many tables Ignatius needs at least. Do NOT print any blanks. Sample Input 2 5 3 1 2 2 3 4 5 5 1 2 5 Sample Output 2 4 Author Ignatius.L Source 杭电ACM省赛集训队选拔赛之热身赛
来源: http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1006&ojid=0&cid=10791&hide=0
#include <cstdio> #include <algorithm> #include <set> using namespace std; #define MAXN 1000*2 int Par[MAXN],Rank[MAXN]; void Init(int n) { for(int i=1;i<=n;i++) { Par[i] = i; Rank[i] = 0; } } int Find(int x) { if(Par[x] == x) return x; else return Par[x] = Find(Par[x]); } void Unite(int x,int y) { x = Find(x);y = Find(y); if(x == y) return; if(Rank[x] < Rank[y]) Par[x] = y; else Par[y] = x; if(Rank[x] == Rank[y]) Rank[x]++; } int main(void) { // freopen("F:\\test.txt","r",stdin); int T;scanf("%d",&T); for(int t=1;t<=T;t++) { int N,M;scanf("%d %d",&N,&M); Init(N); for(int i = 1,a,b;i<=M&&scanf("%d %d",&a,&b);i++) Unite(a,b); set<int> Set; for(int i=1;i<=N;i++) Set.insert(Find(i)); printf("%d\n",Set.size()); } }
相关文章推荐
- redis集群的合纵和连横
- 3.8 编写一个程序打印如图 3.1 所示的 n 阶杨辉三角形,其中 n 由用户输入,该值不 能大于 13。
- yum方式安装ffmpeg步骤
- HDU 1233 还是畅通工程 最小生成树 Prim模板的应用
- Java异常处理-----程序中的异常处理.启蒙
- Java异常处理-----程序中的异常处理.启蒙
- Codeforces 701E Connecting Universities 贪心
- 快速排序算法的时间复杂度分析[详解Master method]
- [HDU 5739] Fantasia (点双联通分量 + Block Forest Data Structure)
- Xcode项目工程文件存放的地方
- 显示在文本框中输入的信息
- 使用l1-magic工具箱求解基追踪(BP)和基追踪降噪(BPDN)
- 48.自定义邮件模板
- POJ-1094 Sorting It All Out
- 物体检测-回归方法(YOLO+SSD)
- 4000 JSP的7个动作指令
- 简单dp算法——Milking Time
- POJ1182 食物链 并查集
- 如何查看OS linux下目录、文件夹或文件所挂载的分区
- USACO 奶牛排队