并查集

题目

今天是伊格那丢的生日。他邀请了很多朋友。现在该吃晚饭了。伊格那丢想知道他至少需要多少张桌子。你必须注意到并不是所有的朋友都认识对方,而且所有的朋友都不想和陌生人待在一起。这个问题的一个重要规则是如果我告诉你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++初学记录(并查集)的更多相关文章

  1. 并查集(Java实现)

    (最好在电脑下浏览本篇博客...手机上看代码不方便) 当时学的时候看的一本印度的数据结构书(好像是..有点忘了..反正跟同学们看的都不一样...)...里面把本文提到的所有情况都提到了,我这里只是重复 ...

  2. BZOJ3673/3674:可持久化并查集

    Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...

  3. [NOI2018]归程(可持久化并查集,Kruskal重构树)

    解法一: 1.首先想到离线做法:将边和询问从大到小排序,并查集维护连通块以及每个连通块中所有点到1号点的最短距离.$O(n\log n)$ 配合暴力等可以拿到75分. 2.很容易想到在线做法,使用可持 ...

  4. codeforces 1023 D. Array Restoration 并查集

    D. Array Restoration time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. bzoj 4883 [Lydsy1705月赛]棋盘上的守卫——并查集(思路!)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4883 把各行和各列看成n+m个点. 如果一下能防守行和列,就是最大匹配了.这是每两个左右部点 ...

  6. [APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释)

    [APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释) 题面 略 分析 考试的时候就感觉子任务4是突破口,结果却写了个Kruskal重构树,然后一直想怎么在线用数据结构维护 实 ...

  7. hdu 3234 Exclusive-OR (并查集)

    Problem - 3234 题意不难理解,就是给出一些断言,以及一些查询,回答查询或者在找到断言矛盾以后沉默不做任何事. 这题其实就是一个并查集的距离存储问题,只要记录并查集元素的相对值以及绝对值就 ...

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

  9. #C++初学记录(奶酪#并查集)

    原题目:牛客网 题目描述 : 现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞.我们可以在这块奶酪中建立空间坐标系, 在坐标系中,奶酪的下表面为 ...

随机推荐

  1. iOS - UIImageView - how to handle UIImage image orientation

    本文转载至 http://stackoverflow.com/questions/8915630/ios-uiimageview-how-to-handle-uiimage-image-orienta ...

  2. 【PHP】数字补零的两种方法

    在php中有两个函数,能够实现数字补零, str_pad() sprintf() 函数1 : str_pad 顾名思义这个函数是针对字符串来说的这个可以对指定的字符串填补任何其它的字符串 例如:str ...

  3. 关于hql语句的一些问题

    1.student is not mapped问题: 在执行显示数据库数据的时候出错 大概提示说: errors: s.entr_Id student is not mapped 碰到这种情况一般是: ...

  4. 【BZOJ2004】[Hnoi2010]Bus 公交线路 状压+矩阵乘法

    [BZOJ2004][Hnoi2010]Bus 公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1 ...

  5. spring mvc的@Transactional注解

    转自:https://www.cnblogs.com/yepei/p/4716112.html spring的@Transactional注解详细用法   概述 事务管理对于企业应用来说是至关重要的, ...

  6. ExtJS学习

    ExtJS是一门比较纠结的框架,自己不太熟,因为现在在做一些老项目,所以没办法要学点.记录下.其实Ext也不是很难,主要是多查查API,了解其基本的用法,然后慢慢去学习,学成之后做管理系统还是很有优势 ...

  7. 处理URL传递中文乱码问题

    在网上搜了很多资料都没有搞定,一般都有以下几种说法: 方法1:在后台中先获得字符串的iso-8859-1编码形式数组,再使用此数组实例一个UTF-8编码形式String类型字符串. 页面提交的url为 ...

  8. Spring容器装配Bean的三种方式

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  9. Xshell配置ssh免密码登录-密钥公钥(Public key)

    1 简介 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法. 使用密钥登录分为3步: 1 ...

  10. pta习题集5-16 朋友圈

    某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友"这个推论可以得 ...