博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1213 How Many Tables
阅读量:6291 次
发布时间:2019-06-22

本文共 2503 字,大约阅读时间需要 8 分钟。

How Many Tables

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 27651    Accepted Submission(s): 13726

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
题目链接:
分析:又是一波并查集,终于给我搞定了一道题,受了畅通工程的影响,这道题我也是刷刷刷的就过了!高兴!
具体并查集该怎么写,可以参照我的博客有关并查集专题讲解,绝对让你受益一生!
下面给出AC代码:
1 #include 
2 using namespace std; 3 int pre[1010]; 4 int t[1010]; 5 int find(int x) 6 { 7 int r=x; 8 while(pre[r]!=r) 9 r=pre[r];10 int i=x,j;11 while(pre[r]!=r)12 {13 j=pre[r];14 pre[r]=r;15 i=j;16 }17 return r;18 }19 void join(int x,int y)20 {21 int fx=find(x),fy=find(y);22 if(fx!=fy)23 pre[fy]=fx;24 }25 int main()26 {27 int N,M,a,b,i,ans,n,m;28 while(scanf("%d",&N)!=EOF)29 {30 while(N--)31 {32 scanf("%d%d",&a,&b);33 for(i=1;i<=a;i++)34 pre[i]=i;35 for(i=1;i<=b;i++)36 {37 scanf("%d%d",&n,&m);38 join(n,m);39 }40 memset(t,0,sizeof(t));41 for(i=1;i<=a;i++)42 t[find(i)]=1;43 for(ans=0,i=1;i<=a;i++)44 if(t[i])45 ans++;46 printf("%d\n",ans);47 }48 }49 return 0;50 }

 

转载地址:http://lnjta.baihongyu.com/

你可能感兴趣的文章
从JDK源码角度看Long
查看>>
你不曾见过的酷炫地图可视化作品(一)
查看>>
二线城市疯狂抢人,技术人才何去何从?
查看>>
如果想成为一名顶尖的前端,这份书单你一定要收藏!
查看>>
iOS Swift UISearchController的取消按钮
查看>>
MyBatis 框架系列之基础初识
查看>>
破解微软智能手环
查看>>
Android Adobe Reader 任意代码执行分析(附POC)
查看>>
megalo -- 网易考拉小程序解决方案
查看>>
iOS 网络编程(二)UDP协议小结
查看>>
Dubbo入门(2) - 简单实践
查看>>
关于Open开头的开源技术库全面汇总,看这一篇就够了
查看>>
React Native学习总结第一天
查看>>
程序猿小白应该注意什么
查看>>
Facebook 对前端工程师的要求是啥?一起来看看
查看>>
一个有趣的小例子,带你入门协程模块-asyncio
查看>>
Android每周一个学习计划——RxJava2 0的学习使用
查看>>
Activity源码分析
查看>>
让CoreData更简单些
查看>>
线上CPU100%?看看这篇是怎么排查的。
查看>>