HDU1213 并查集模板
来源:互联网 发布:2007年网络歌曲 编辑:程序博客网 时间:2024/06/05 14:08
How Many Tables
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 27984 Accepted Submission(s): 13878
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.
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
25 31 22 34 55 12 5
Sample Output
24#include "stdio.h"int tri[1005];void init(){ //初始化根节点 for(int i=1;i<1005;i++){tri[i]=i;}}int find(int x){ //找根节点 while(x!=tri[x]){x=tri[x];} return x;} bool merge(int a,int b){int c=find(a);int d=find(b);if(c!=d){ //若两者不在一个集合中 进行合并 true 合并成功 false不用合并 tri[c]=d;return true; }return false;}int main(){int kk;scanf("%d",&kk);while (kk--){init(); int n,m;scanf("%d%d",&n,&m);int x,y;for(int i=0;i<m;i++){scanf("%d%d",&x,&y);merge(x,y); }int num=0;for(int i=1;i<=n;i++){if(tri[i]==i)num++;}printf("%d\n",num);}}
0 0
- hdu1213并查集模板
- hdu1213(并查集模板)
- HDU1213 并查集模板
- hdu1213(并查集模板)
- hdu1213+并查集模板(优化)
- hdu1213 并查集
- HDU1213并查集
- HDU1213 并查集
- HDU1213(并查集)
- 并查集-hdu1213
- hdu1213 并查集
- 并查集模板题 HDU1213 How Many Tables
- hdu1213(并查集)
- hdu1213(并查集复习)
- HDU1213并查集基础
- HDU1213 基础并查集
- HDU1213基础并查集
- hdu1213(基础并查集)
- C++第二次实验-循环程序设计-项目7(输出完数)
- 通过maven profile实现多套环境配置
- jQuery选择器的结果是prevobject:e.fn.e.init [1]我怎么得到一个元素
- WebView 图片大小自适应问题
- leetcode 100. Same Tree
- HDU1213 并查集模板
- 关于ButterKnife框架Android ButterKnife Zelezny插件安装成功但不显示Generate ButterKnife Injections选项的问题
- 用sql语句,将两个字段合并,并当做条件进行查询的方法
- 40. Combination Sum II
- 对N个数进行排序
- Android Studio安装及配置、及使用常见问题
- 添加一个对象到集合中时,集合里面存放的是对象的引用
- iOS IHKeyboardAvoiding的使用
- jquery 绑定点击事件 多次执行问题