HDU 1213
来源:互联网 发布:淘宝美工面试常问问题 编辑:程序博客网 时间:2024/05/18 23:56
How Many Tables
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 19294 Accepted Submission(s): 9577
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
Author
Ignatius.L
题意是求有多少个独立的集合,用并查集合并元素,输出时判断每个点的根节点是否为自己,即fa[i]==i,使答案+1,
#include<iostream>#include<cstdio>using namespace std;#define N 2000int fa[N],rk[N];void init(int n){for (int i = 0; i <= n; i++){rk[i] = 1;fa[i] = i;}}int find(int x){return x == fa[x] ? x : fa[x] = find(fa[x]);}void unio(int x, int y){x = find(x);y = find(y);if (rk[x] < rk[y]){fa[x] = y;rk[y] += rk[x];}else{fa[y] = x;rk[x] += rk[y];}}int main(){#ifdef CDZSCfreopen("i.txt", "r",stdin);#endifint n,t,m,x,y;scanf("%d", &t);while (t--){int ans = 0;scanf("%d%d", &n, &m);init(n);while (m--){scanf("%d%d", &x, &y);unio(x, y);}for (int i = 1; i <= n; i++)if (fa[i] == i)++ans;printf("%d\n", ans);}return 0;}
0 0
- HDU 1213
- HDU 1213
- HDU 1213
- HDU 1213
- HDU 1213
- hdu 1213
- hdu 1213
- HDU 1213
- HDU 1213
- hdu 1213
- hdu 1213
- hdu 1213
- hdu 1213
- hdu 1213
- hdu(1213)
- HDU 1213
- hdu 1213
- HDU 1213
- 程序员的剑伤
- 1041. 考试座位号(15)
- CSS样式----图文详解(二):css属性
- HDU 5135 Little Zu Chongzhi's Triangles (2014年广州赛区现场赛I题)
- 原子操作 vs 非原子操作
- HDU 1213
- Android 学习笔记8——传感器使用
- 机器学习笔记 线性判别分析(中)
- LINGO中的集
- Leetcode Word Search
- 机器学习笔记 线性判别分析(上)
- 1042. 字符统计(20)
- java中用文件流分割文件,用于将大文件分割成多个小文件,合并文件待续
- 理解memcached的内存存储