hdoj1213How Many Tables
2015-08-11 19:19
429 查看
How Many Tables
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18681 Accepted Submission(s): 9276
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 直接模板,求桌子数量即求树根的数量! 代码:#include<stdio.h> #define max 1500 int set[max]; int table,person,cognize; struct line { int start; int end; }num[max]; int find(int p)//查找根节点 { int t; int child=p; while(p!=set[p]) p=set[p]; while(child!=p) { t=set[child]; set[child]=p; child=t; } return p; } void merge(int x,int y)//合并 { int fx=find(x); int fy=find(y); if(fx!=fy) set[fx]=fy; } int main() { int i,j,k,t,u=0; scanf("%d",&t); while(t--) { k=0; scanf("%d%d",&person,&cognize); for(i=1;i<=person;i++) { set[i]=i; } for(i=1;i<=cognize;i++) { scanf("%d%d",&num[i].start ,&num[i].end ); } for(i=1;i<=cognize;i++) { if(find(num[i].start )!=find(num[i].end ))//判断是否成环即是否认识的人相重复 merge(num[i].start ,num[i].end ); } for(i=1;i<=person;i++)//判断树的数量即桌子的数量! { if(set[i]==i) k++; } printf("%d\n",k); } return 0; }原题目:hdoj1213How Many Tables
相关文章推荐
- web下乱码处理
- LNMP里常见的502问题
- Android API Guides学习2——Common Intents
- i2c信号的ACK与NACK
- hdu1251
- SDKD Summer Team Contest K
- jstack命令
- cvthreshold 的运用
- Constructing Roads --hdoj
- 深入理解JVM:HotSpot虚拟机对象探秘
- Constructing Roads --hdoj
- hdu5379 dfs+排列组合
- 如何在 Linux 上运行命令前临时清空 Bash 环境变量
- jmeter CSV Data数据中带有逗号解决方法
- java IO流(java分割、合并任意类型文件)
- Leetcode# 122 Best Time to Buy and Sell Stock II
- Launcher模块总结
- Jungle Roads
- 智渔课堂官方免费教程二十六:Java基础教程之数组
- Truck History --hdoj