#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,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞.我们可以在这块奶酪中建立空间坐标系, 在坐标系中,奶酪的下表面为 ...
随机推荐
- mybatis由浅入深day01_6SqlMapConfig.xml(6.2settings全局参数配置_6.3typeAliases(类型别名)_6.4typeHandlers(类型处理器)_6.5mappers(映射配置))
6 SqlMapConfig.xml mybatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) settings(全局配置参数) typeAli ...
- POJ 1947 Rebuilding Road(树形DP)
Description The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, n ...
- Python 中文乱码
1.首行添加 # -*- coding:gb2312 -*- # -*- coding:utf-8 -*- 2.PyCharm设置 在File->setting->File Encodin ...
- python2.0 s12 day2
s12 day2 视频每节的内容 05 python s12 day2 python编码 1.第一句python代码 python 执行代码的过程 文件读到内存 分析内容 编译字节码 转换机器码 ...
- 集群--LVS的介绍
相关概念 LVS体系结构如图所示,一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(Load Balancer).负载调度器能无缝地将网络请求调度到真实服务器 ...
- [置顶] 数据库优化实践【MS SQL优化开篇】
数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应用程序,对数据的CRUD操作进行统一管理和控 ...
- 设计模式-UML类图基础
设计模式之序-UML类图那点事儿 打14年年底就像写那么一个系列,用于讲设计模式的,代码基于JAVA语言,最早接触设计模式是大一还是大二来着,那时候网上有人给推荐书,其中就有设计模式,当时给我推荐的书 ...
- url-loader与file-loader
一开始用url-loader的时候,想着为什么npm run build的时候,不能将图片打包到build images的目录下,原来,没有自己看这样的说明: loader 后面 limit 字段代表 ...
- Dell、IBM服务器配置远程管理卡
author: headsen chen date: 2018-10-09 14:12:32 1,IBM的服务器: 需要在bios里边进行配置,具体配置如下: , 开机画面过完之后,按F1进入bio ...
- salt-ssh的批量脚本及使用方法
author: headsen chen date : 2018-08-02 20:06:06 1,salt-ssh的安装: yum -y install epel-release yum - ...