How Many Tables
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9425 Accepted Submission(s): 4658
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
2
5 3
1 2
2 3
4 5
5 1
2 5
Sample Output
2
4
题意:
有T(1到25)个Case,每个Case首先有N个人(1到1000)和M(1到1000)对朋友关系,如果a和b是朋友,b和c是朋友,那么a和c也算是朋友。规定同是朋友的可以坐在同一桌台上,不是朋友的则不能,问最少需要有多少张台。
思路:
并查集基础题。先把每个人都分别算为一个独立的集合,然后再根据给出的朋友关系合并到同一个集合中,最后算一共有几个集合即可。
AC:
#include<stdio.h> #include<string.h> int main() { int t; int set[1005]; //代表每个人属于哪个集合 scanf("%d",&t); while(t--) { int n,m; int sum=0; scanf("%d%d",&n,&m); memset(set,0,sizeof(set)); for(int i=1;i<=n;i++) set[i]=i; //每个人独立为一个集合 while(m--) { int a,b; int x,y; scanf("%d%d",&a,&b); x=set[a]; y=set[b]; if(x==y) continue; //如果属于同一个集合则不需合并 if(x>y) { for(int j=1;j<=n;j++) if(set[j]==x) set[j]=y; } if(x<y) { for(int j=1;j<=n;j++) if(set[j]==y) set[j]=x; } //如果不属于同一个集合则合并,将处于集合更大的序数合并到小的序号中 } for(int i=1;i<=n;i++) if(set[i]==i) sum++; //每个集合都以小序号的名字命名 //所以当集合名与本身序数一样,说明为一个新的集合 printf("%d\n",sum); } return 0; }
小改进:
#include<stdio.h> #include<string.h> int main() { int t; int set[1005]; scanf("%d",&t); while(t--) { int n,m,sum; scanf("%d%d",&n,&m); memset(set,0,sizeof(set)); for(int i=1;i<=n;i++) set[i]=i; sum=0; while(m--) { int a,b; int min,max,temp; scanf("%d%d",&a,&b); min=set[a]; max=set[b]; if(min==max) continue; //主要是这段 if(min>max) { temp=min; min=max; max=temp; } for(int i=1;i<=n;i++) if(set[i]==max) set[i]=min; //合并不是同一集合的元素 } for(int i=1;i<=n;i++) if(set[i]==i) sum++; printf("%d\n",sum); } return 0; }
总结:
一开始还以为有多难,原理不难懂,关键是敲代码。敲得太少,加上畏难心理,拖延浪费了不少时间。
相关推荐
本资源提供了多种关于并查集的题目,例如 How Many Tables、小希的迷宫、Is It A Tree?等。 枚举最小生成树 枚举最小生成树是一种组合算法,用于解决最小生成树问题。本资源提供了多种关于枚举最小生成树的题目,...
【ACM之图论500道】是一个挑战性的图论题目集合,旨在通过大量练习提升你在图论领域的技能,特别是在最小生成树和并查集这两个核心概念上。完成这500道题,你将可能达到图论的较高水平。 最小生成树是图论中的一个...
轴类零件加工工艺设计.zip
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
seaborn基本绘图人力资源数据集
移动机器人(sw三维)
自制html网页源代码查看器
3吨叉车的液压系统设计().zip
1_实验三 扰码、卷积编码及交织.ppt
北京交通大学软件学院自命题科目考试大纲.pdf
雅鲁藏布江流域 shp矢量数据 (范围+DEM).zip
基于RUST的数据结构代码示例,栈、队列、图等
NIFD:2024Q1房地产金融报告
详细介绍及样例数据:https://blog.csdn.net/li514006030/article/details/146916652
【工业机器视觉定位软件Vision-Detect】基于C#的WPF与Halcon开发的工业机器视觉定位软件(整套源码),开箱即用 有用户登录,图片加载,模板创建,通讯工具,抓边抓圆,良率统计,LOG日志,异常管理,九点标定和流程加载保存等模块,功能不是很完善,适合初学者参考学习。 资源介绍请查阅:https://blog.csdn.net/m0_37302966/article/details/146912206 更多视觉框架资源:https://blog.csdn.net/m0_37302966/article/details/146583453
内容概要:本文档详细介绍了Java虚拟机(JVM)的相关知识点,涵盖Java内存模型、垃圾回收机制及算法、垃圾收集器、内存分配策略、虚拟机类加载机制和JVM调优等内容。首先阐述了Java代码的编译和运行过程,以及JVM的基本组成部分及其运行流程。接着深入探讨了JVM的各个运行时数据区,如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区等的作用和特点。随后,文档详细解析了垃圾回收机制,包括GC的概念、工作原理、优点和缺点,并介绍了几种常见的垃圾回收算法。此外,文档还讲解了JVM的分代收集策略,新生代和老年代的区别,以及不同垃圾收集器的工作方式。最后,文档介绍了类加载机制、JVM调优的方法和工具,以及常用的JVM调优参数。 适合人群:具备一定Java编程基础的研发人员,尤其是希望深入了解JVM内部机制、优化程序性能的技术人员。 使用场景及目标:①帮助开发人员理解Java代码的编译和执行过程;②掌握JVM内存管理机制,包括内存分配、垃圾回收等;③熟悉类加载机制,了解类加载器的工作原理;④学会使用JVM调优工具,掌握常用调优参数,提升应用程序性能。 其他说明:本文档内容详尽,适合用作面试准备材料和技术学习资料,有助于提高开发人员对JVM的理解和应用能力。
Android项目原生java语言课程设计,包含LW+ppt
戴德梁行&中国房地产协会:2021亚洲房地产投资信托基金研究报告
Android项目原生java语言课程设计,包含LW+ppt
Thinkphp6.0+vue个人虚拟物品发卡网站源码 支持码支付对接 扫码自动发货 源码一共包含两个部分thinkphp6.0后端文件,以及vue前端文件.zip