并查集算法题-We Are A Team-python实现
题目描述
【We Are A Team】
总共有 n 个人在机房,每个人有一个标号(1<=标号<=n),他们分成了多个团队,需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中,具体的:
1、消息构成为 a b c,整数 a、b 分别代表两个人的标号,整数 c 代表指令
2、c == 0 代表 a 和 b 在一个团队内
3、c == 1 代表需要判定 a 和 b 的关系,如果 a 和 b 是一个团队,输出一行’we are a team’,如果不是,输出一行’we are not a team’
4、c 为其他值,或当前行 a 或 b 超出 1~n 的范围,输出‘da pian zi’
输入描述
- 第一行包含两个整数 n,m(1<=n,m<100000),分别表示有 n 个人和 m 条消息
- 随后的 m 行,每行一条消息,消息格式为:a b c(1<=a,b<=n,0<=c<=1)
- 输出描述: 1、c ==1,根据 a 和 b 是否在一个团队中输出一行字符串,在一个团队中输出‘we are a team’,不在一个团队中输出’we are not a team’ 2、c 为其他值,或当前行 a 或 b 的标号小于 1 或者大于 n 时,输出字符串‘da pian zi’
- 如果第一行 n 和 m 的值超出约定的范围时,输出字符串”Null”。
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
5 7
1 2 0
4 5 0
2 3 0
1 2 1
2 3 1
4 5 1
1 5 1
输出
We are a team
We are a team
We are a team
We are not a team
示例2 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
5 6
1 2 0
1 2 1
1 5 0
2 3 1
2 5 1
1 3 2
输出
we are a team
we are not a team
we are a team
da pian zi
参考链接:
算法学习笔记 : 并查集https://zhuanlan.zhihu.com/p/93647900
Python实现
class Solution:def __init__(self, n):self.n = nself.parents = {}self.rank = {}# 用一个rank记录每个根节点对应的树的深度# (如果不是根节点,其rank相当于以它作为根节点的子树的深度)。# 一开始,把所有元素的rank(秩)设为1。# 合并时比较两个根节点,把rank较小者往较大者上合并。for i in range(self.n + 1):self.parents[i] = iself.rank[i] = 1def find(self, x): # 合并(路径压缩)if self.parents[x] == x:return xelse:self.parents[x] = self.find(self.parents[x])return self.parents[x]# 用递归的写法实现对代表元素的查询:一层一层访问父节点,直至根节点(根节点的标志就是父节点是本身)。# 要判断两个元素是否属于同一个集合,只需要看它们的根节点是否相同即可。def merge(self, i, j): # 合并x = self.find(i)y = self.find(j) # 先找到两个根节点if self.rank[x] <= self.rank[y]:self.parents[x] = yelse:self.parents[y] = xif self.rank[x] == self.rank[y] and x != y:self.rank[y] += 1 # 如果深度相同且根节点不同,则新的根节点的深度+1while True:try:n,m=map(int,input().split())team = Solution(n)if m < 1 or m > 100000 or n < 1 or n > 100000:print("NULL")breakfor i in range(m):a, b, c = map(int, input().split())if a < 1 or a > n or b < 1 or b > n:print("da pian zi")if c == 0:team.merge(a, b)elif c == 1:if team.find(a) == team.find(b):print("We are a team")else:print("We are not a team")else:print("da pian zi")except:break
并查集算法题-We Are A Team-python实现相关推荐
- C++并查集算法(详细)
C++并查集算法 什么是并查集? 并查集写法 详解 例题:洛谷 P3367.[模板]并查集 题意 代码 什么是并查集? 当我们在做图论题目的时候 经常会读到一些长这样的题目描述: -连接 a , b ...
- 给我三分钟,带你领略热血江湖中的并查集算法
你好,我是小黄,一名独角兽企业的Java开发工程师. 校招收获数十个offer,年薪均20W~40W. 感谢茫茫人海中我们能够相遇, 俗话说:当你的才华和能力,不足以支撑你的梦想的时候,请静下心来学习 ...
- 并查集算法总结专题训练
并查集算法总结&专题训练 1.概述 2.模板 3.例题 1.入门题: 2.与别的算法结合: 3.考思维的题: 4.二维转一维: 5.扩展域并查集&边带权并查集: 4.总结 1.概述 并 ...
- PAT题解-1118. Birds in Forest (25)-(并查集模板题)
如题... #include <iostream> #include <cstdio> #include <algorithm> #include <stri ...
- Union-Find 并查集算法详解
Union-Find 并查集算法详解 文章目录 Union-Find 并查集算法详解 一.问题介绍 二.基本思路 三.平衡性优化 四.路径压缩 五.总结 六.例题 一.问题介绍 简单说,动态连通性其实 ...
- 简单易懂的并查集算法以及并查集实战演练
文章目录 前言 一.引例 二.结合引例写出并查集 1. 并查集维护一个数组 2. 并查集的 并 操作 3. 并查集的 查 操作 4. 基本并查集模板代码实现--第一版(有错误后面分析) 4.1 Jav ...
- 【SCAU 新生赛】18247 aler的旅游计划 并查集模板题
18247 aler的旅游计划 该题有题解 时间限制:1000MS 代码长度限制:10KB 提交次数:15 通过次数:0 收入:10 题型: 编程题 语言: 不限定 Description aler想 ...
- 并查集算法 | Union-Find Algorithm
Union-Find Algorithm即并查集算法,常用于解决 动态连通性,判断有向无圈图等问题. 根本上讲,Union-Find算法就和他的名字一样是一种对不相交集数据结构执行两个有用操作的算法, ...
- 战争来临(并查集模板题)
战争来临(并查集模板题) 描述 那一个骑单车卖报纸的少年 恐慌的眼泪慢慢布满了侧脸----<战争世界> B国对A国发动了侵略战争,A国不得不全力抵御.A国幅员辽阔,后方群众的支援补 ...
- 并查集算法----犯罪团伙(黑科技)
一.题目描述 犯罪团伙(gang.cpp) 题目描述 警察抓到了n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯 ...
最新文章
- R语言-文本挖掘 主题模型 文本分类
- 用c语言描述单链表的数据类型,数据结构—单链表(类C语言描述)
- ZOJ - 2676 Network Wars(01分数规划+最小割)
- python正则匹配日期2019-03-11_都2019年了,正则表达式为啥还是这么难?这里的Python学习教程教你搞定!...
- python与javascript比较_Javascript变量语义与Python的比较
- LeetCode 385. 迷你语法分析器(栈)
- 华科计算机复试ccf成绩,新鲜速递!刚拟录取华科学妹总结的复试攻略,快看
- 通过反射--操作运行时类中的指定的属性/方法
- C语言中对程序设计的理解,浅论《C语言程序设计》的学习方法
- BUUCTF中的“新年快乐”
- (火星)MBTI职业性格测试
- 华为公司专家组一行莅临物通博联调研指导
- ubuntu12.04 GX编译环境搭建
- Windows10彻底卸载VMWare虚拟机
- IT 人能在一线城市里生活一辈子吗?
- 测试集数据语义特征t_SNE降维可视化
- 植物大战僵尸OD给僵尸加防具
- e:可以解包多种存档花样的小工具
- java 文本域不可编辑_实现表单input文本框不可编辑的三种方法
- SCI影响因子及自然科学基金查询(MedSci)