C语言题目:有多少张桌子--并查集

目录
  • 【Problem Description】问题描述
  • 【Input】输入
  • 【Output】输出
  • 【Sample Output】样本输出
  • 【Code】代码
  • 总结

【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.

今天是伊格纳修斯的生日。他邀请了很多朋友。现在是吃晚饭的时间了。伊格纳修斯想知道他至少需要多少张桌子。你必须注意,并不是所有的朋友都互相认识,而且所有的朋友都不想和陌生人呆在一起。
这个问题的一个重要规则是,如果我告诉你A认识B,B认识C,这意味着A,B,C相互认识,所以他们可以呆在一张桌子上。
例如:如果我告诉你A知道B,B知道C,D知道E,那么A,B,C可以呆在一张桌子上,而D,E必须呆在另一张桌子上。所以伊格纳修斯至少需要两张桌子。

【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.

输入以整数T(1<=T<=25)开始,表示测试用例的数量。然后,T测试用例随之出现。每个测试用例从两个整数N和M开始(1<=N,M<=1000)。N表示朋友的数量,朋友标记为从1到N。然后M行跟随。每行由两个整数A和B(A=B) 意思是朋友A和朋友B彼此认识。两个案例之间将有一个空白行。

【Output】输出

For each test case, just output how many tables Ignatius needs at least. Do NOT print any blanks.

对于每个测试用例,只需输出Ignatius至少需要多少个表。不要打印任何空白。

【Sample Input】样本输入

2
5 3
1 2
2 3
4 5

5 1
2 5

【Sample Output】样本输出

2
4

【Code】代码

#include <iostream>
using namespace std;
const int maxn=1005;
int pre[maxn];
int find(int x) {
	if(x!=pre[x]) pre[x]=find(pre[x]);
	return pre[x];
}
void merge(int x,int y) {
	if(find(x)!=find(y)) pre[find(x)]=find(y);
}
int main() {
	int T,N,M;
	int p,q;
	scanf("%d",&T);
	while(T--) {
		int ans=0;
		scanf("%d%d",&N,&M);
		for(int i=1; i<=N; i++) pre[i]=i;
		for(int i=1; i<=M; i++) {
			scanf("%d%d",&p,&q);
			merge(p,q);
		}
		for(int i=1; i<=N; i++) {
			if(find(i)==i) ans++;
		}
		printf("%d\n",ans);
	}
	return 0;
}

/*
in:
2
5 3
1 2
2 3
4 5
5 1
2 5
out:
2
4
*/

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言--数字交换题目详解

    目录 一.题目分析 二.算法分析和设计 心路历程 位置分析 分析交换算法 回顾总结(问题核心) 三.编写代码 四.出现问题 总结 一.题目分析 大致题意就是通过交换把最小的数放到最前面,最大的数放最后面.另外要求编写三个函数. 二.算法分析和设计 心路历程 题目有四个关键词,最大值和最小值,第一个数和最后一个数.这就是我们分析的重点. 接下来先对最大值和最小值分析,如果两个数的值相同,位置相同,说明所有的数据都相同,我们什么都不用做.如果两个数的值不同,位置肯定也不同,所以最大值和最小值的位置关

  • C语言 经典题目螺旋矩阵 实例详解

    C语言 经典题目螺旋矩阵 //N阶螺旋矩阵 #include <stdio.h> #include <stdlib.h> int main() { int N,i,j,n,num=1; int a[10][10]={0}; printf("输入你要输出的几阶中断:"); scanf("%d",&N); for(n=0;n<=N/2;n++) { for(j=n;j<=N-n-1;j++) a[n][j]=num++; fo

  • 北邮考研复试C语言上机题目精选

    查找 题目描述:            输入数组长度 n       输入数组 a[1...n]       输入查找个数m       输入查找数字b[1...m]             输出 YES or NO 查找有则YES 否则NO .      输入:            输入有多组数据.      每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m<=n<=100).      输出:            如果在n个数组中输出YES否则输出NO.   

  • C语言并查集的非递归实现详解

    目录 [算法分析] [算法代码] 并查集压缩路径非递归写法 参考文章 总结 [算法分析] 经典的递归实现的并查集,在数据规模过大时,可能会爆栈,因此有了并查集的非递归实现.核心代码如下: int find(int x) { int t=x; while(t!=pre[t]) t=pre[t]; while(x!=pre[x]) { x=pre[x]; pre[x]=t; } return t; } void merge(int x,int y) { if(find(x)!=find(y)) pr

  • c语言数据结构之并查集 总结

    并查集(Union-Find Set): 一种用于管理分组的数据结构.它具备两个操作:(1)查询元素a和元素b是否为同一组 (2) 将元素a和b合并为同一组. 注意:并查集不能将在同一组的元素拆分为两组. 并查集的实现: 用树来实现. 使用树形结构来表示以后,每一组都对应一棵树,然而我们就可以将这个问题转化为树的问题了,我们看两个元素是否为一组我们只要看这两个元素的根是否一致.显然,使用树形结构将问题简单化了.合并时是我们只需要将一组的根与另一组的根相连即可. 并查集的核心在于,一棵树的所有节点

  • 一波C语言二元查找树算法题目解答实例汇总

    按层次遍历二元树 问题描述:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印.  例如输入: 8 / / 6 10 / / / / 5 7 9 11 输出 8 6 10 5 7 9 11 定义二元树(其实是二元搜索树,但并不遍历算法)的结点为: struct BSTreeNode { int value; BSTreeNode *left; BSTreeNode *right; }; 思路:利用队列的先进先出,很容易实现.每次取出队列的首元素,然后将其左右子女放入队列

  • C语言题目:有多少张桌子--并查集

    目录 [Problem Description]问题描述 [Input]输入 [Output]输出 [Sample Output]样本输出 [Code]代码 总结 [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

  • 15张Vim速查表-帮你提高N倍效率

    去年上半年开始全面使用linux进行开发和娱乐了,现在已经回不去windows了. 话归正传,在Linux上一直使用vim,慢慢熟悉了它的命令,才终于领悟了什么是编辑器之神. 最近抽空整理了这份速查表,收获颇丰,并分享给大家. 进入vim vim配置 移动光标 屏幕滚动 插入文本类 删除命令 复制粘贴 撤销 搜索及替换 书签 visual模式 行方式命令 若不指定n1,n2,则表示将整个文件内容作为command的输入 | 宏 窗口操作 文件及其他 推荐: 感兴趣的朋友可以关注小编的微信公众号[

  • C++并查集亲戚(Relations)算法实例

    本文实例讲述了C++并查集亲戚(Relations)算法.分享给大家供大家参考.具体分析如下: 题目: 亲戚(Relations) 或许你并不知道,你的某个朋友是你的亲戚.他可能是你的曾祖父的外公的女婿的外甥的表姐的孙子.如果能得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系实非人力所能及.在这种情况下,最好的帮手就是计算机. 为了将问题简化,你将得到一些亲戚关系的信息,如同Marry和Tom是亲戚,Tom和B en是

  • java编程实现并查集的路径压缩代码详解

    首先看两张路径压缩的图片: 并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子图.求最小生成树的 Kruskal 算法和求最近公共祖先(Least Common Ancestors, LCA)等. 使用并查集时,首先会存在一组不相交的动态集合 S={S 1 ,S 2 ,⋯,S k } ,一般都会使用一个整数表示集合中的一个元素. 每个集合可能包含一个或多个元素,并选出集合中的某个元素作为代表.每个集合中具体包含

  • c++初级并查集知识点总结

    并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题. 有一个联合- 查找算法定义了两个用于此数据结构的操作: Find :确定元素属于哪一个子集.它可以被用来确定两个元素是否属于同一子集. Union:将两个子集合并成同一个集合. 并查集主要运用在合并元素以及查询两个元素是否在同一集合的问题,在信息学竞赛中广泛涉及 初始化: 一开始,每一个元素都是一个集合,打个比方,每个人所在的 " 家族 " 只有他一个人.我们还需要一个 f 数组,里面存的是他的 "父亲&quo

  • 数据结构与算法之并查集(不相交集合)

    认识并查集 对于并查集(不相交集合),很多人会感到很陌生,没听过或者不是特别了解.实际上并查集是一种挺高效的数据结构.实现简单,只是所有元素统一遵从一个规律所以让办事情的效率高效起来. 对于定意义,百科上这么定义的: 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受:即使在

  • 详解Java实现数据结构之并查集

    ​一.什么是并查集 对于一种数据结构,肯定是有自己的应用场景和特性,那么并查集是处理什么问题的呢? 并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题,常常在使用中以森林来表示.在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受:即使在空

  • java并查集算法带你领略热血江湖

    目录 一.什么是并查集 二.深入理解并查集 三.实现并查集 四.真题训练 五.路径压缩优化 六.总结 你好,我是小黄,一名独角兽企业的Java开发工程师. 校招收获数十个offer,年薪均20W~40W. 感谢茫茫人海中我们能够相遇, 俗话说:当你的才华和能力,不足以支撑你的梦想的时候,请静下心来学习, 希望优秀的你可以和我一起学习,一起努力,实现属于自己的梦想. 一.什么是并查集 并查集被很多OIer认为是最简洁而优雅的数据结构之一,主要用于处理一些不相交集合的合并问题,并支持两种操作: 合并

随机推荐