#C++初学记录(并查集)
并查集
题目
今天是伊格那丢的生日。他邀请了很多朋友。现在该吃晚饭了。伊格那丢想知道他至少需要多少张桌子。你必须注意到并不是所有的朋友都认识对方,而且所有的朋友都不想和陌生人待在一起。这个问题的一个重要规则是如果我告诉你A认识B, B认识C,这意味着A, B, C互相认识,所以它们可以在一个表中。例如:如果我告诉你A知道B, B知道C, D知道E,那么A, B, C可以在一个表中,D, E必须在另一个表中。伊格那丢至少需要两张表。输入以一个整数T(1<=T<=25)开始,它表示测试用例的数量。然后是T测试用例。每个测试用例都以两个整数N和M开始(1<=N,M<=1000)。N表示朋友的数量,朋友的数量从1到N进行标记,然后是M行。每一行由两个整数A和B(A!=B)组成,这意味着朋友A和朋友B互相认识。两种情况之间会有一条空行。对于每个测试用例,只输出Ignatius至少需要多少个表。不要打印任何空格。
运行代码
#include<iostream>
using namespace std;
int pre[1004];//有1000人
int t,n,m;//测试个数,n个人,M对
int finds(int x)//查找X是谁的friend
{
if(pre[x]==x)//如果是根节点
return x;
else
return pre[x]=finds(pre[x]);//查找上级
}
void mix(int x,int y)
{
int fx=finds(x);//查找X的根节点
int fy=finds(y);//查找Y的根节点
if(fx!=fy)
pre[fx]=fy;
}
int main()
{
cin>>t;//
while(t--)//T次测样测例
{
cin>>n>>m;//n个人,m对关系
for(int i=1;i<=n;++i)//初始化
{
pre[i]=i;//相当于每个人都互相不认识
}
int a,b;//表示a,b关系
for(int i=0;i<m;++i)//对于每一对关系
{
cin>>a>>b;//读入a,b
mix(a,b);//合并a,b到一棵树内,代表a,b互相认识
}
int ans=0;//结果需要多少张桌子
for(int i=1;i<=n;++i)//对于每一个人
{
if(pre[i]==i)//如果这个人是根节点
++ans;//增加一张桌子
}
cout<<ans<<endl;
}
return 0;
}
代码理解
如果你的朋友非常多(假如有一万个),那么计算需要多少张桌子是不容易的,但是在这时,使用并查集可以更加快速的完成这个计算。首先看代码的函数mix部分,mix函数将判断你输入的一组数据中是否有重复的人出现,若一组数据没有重复键入相同的数据,则将数据进行运行下一个函数,finds函数。find函数是对输入的数据进行关联的函数。在程序的起始部分,定义了1004个数据空间的数组,而finds函数是将输入的两个数据一个作为数组的数组名一个作为数组的元素,接着进行递归,即将数组名下的元素再次作为数组名进行查找,若到最后的元素作为数组名再次查找时查找不到下一个元素即if(pre[x]==x),则进行桌位输出即桌位数加一。
#C++初学记录(并查集)的更多相关文章
- 并查集(Java实现)
(最好在电脑下浏览本篇博客...手机上看代码不方便) 当时学的时候看的一本印度的数据结构书(好像是..有点忘了..反正跟同学们看的都不一样...)...里面把本文提到的所有情况都提到了,我这里只是重复 ...
- BZOJ3673/3674:可持久化并查集
Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...
- [NOI2018]归程(可持久化并查集,Kruskal重构树)
解法一: 1.首先想到离线做法:将边和询问从大到小排序,并查集维护连通块以及每个连通块中所有点到1号点的最短距离.$O(n\log n)$ 配合暴力等可以拿到75分. 2.很容易想到在线做法,使用可持 ...
- codeforces 1023 D. Array Restoration 并查集
D. Array Restoration time limit per test 1 second memory limit per test 256 megabytes input standard ...
- bzoj 4883 [Lydsy1705月赛]棋盘上的守卫——并查集(思路!)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4883 把各行和各列看成n+m个点. 如果一下能防守行和列,就是最大匹配了.这是每两个左右部点 ...
- [APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释)
[APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释) 题面 略 分析 考试的时候就感觉子任务4是突破口,结果却写了个Kruskal重构树,然后一直想怎么在线用数据结构维护 实 ...
- hdu 3234 Exclusive-OR (并查集)
Problem - 3234 题意不难理解,就是给出一些断言,以及一些查询,回答查询或者在找到断言矛盾以后沉默不做任何事. 这题其实就是一个并查集的距离存储问题,只要记录并查集元素的相对值以及绝对值就 ...
- PAT Advanced 1034 Head of a Gang (30) [图的遍历,BFS,DFS,并查集]
题目 One way that the police finds the head of a gang is to check people's phone calls. If there is a ...
- #C++初学记录(奶酪#并查集)
原题目:牛客网 题目描述 : 现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞.我们可以在这块奶酪中建立空间坐标系, 在坐标系中,奶酪的下表面为 ...
随机推荐
- C++第15周(春)项目3 - OOP版电子词典(二)
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目3-OOP版电子词典](本程序须要的相关 ...
- POJ 2923 Relocation(01背包变形, 状态压缩DP)
Q: 如何判断几件物品能否被 2 辆车一次拉走? A: DP 问题. 先 dp 求解第一辆车能够装下的最大的重量, 然后计算剩下的重量之和是否小于第二辆车的 capacity, 若小于, 这 OK. ...
- MySQL技术内幕:SQL编程 第2章 数据类型 读书笔记
2.1 类型属性 2.1.1 UNSIGNED 数字无符号化, INT的值 -2147483648 ~ 2147483647 INT UNSIGNED的值 0 ~ 4294967295 int a ...
- Android权限全记录(转)
常用权限: 读写存储卡装载和卸载文件系统 android.permission.WRITE_EXTERNAL_STORAGE android.permission.READ_EXTERNAL_STOR ...
- Facebook广告目标摘要
Facebook Ads look slightly different depending on the results you want. This guide includes recommen ...
- php 关于日期的知识总结
1.UNIX时间戳 time() echo time(); 2.UNIX时间戳转换为日期用函数: date() 一般形式:date(); 即 echo date(date('Y-m-d H:i:s ...
- 【PHP】 php实现字符串反转:支持中英文
strrev 函数对英文很好用,直接可以实现字符串翻转 但是面对中文呢?肯定都是乱码,对于这样的问题有很多,比如strstr,substr等函数都是这样的. PHP提供了mb_类的函数实现不同编码. ...
- java中的Iterator和Iterable 区别
java.lang.Iterable java.util.Iterator 来自百度知道: Iterator是迭代器类,而Iterable是接口. 好多类都实现了Iterable接口,这样对象就可以调 ...
- java高级---->Thread之BlockingQueue的使用
今天我们通过实例来学习一下BlockingQueue的用法.梦想,可以天花乱坠,理想,是我们一步一个脚印踩出来的坎坷道路. BlockingQueue的实例 官方文档上的对于BlockingQueue ...
- PropertyPlaceholderConfigurer读取配置文件
1. PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现,也就是 BeanFactoryPostProcessor接口的一个实现.PropertyPlaceho ...