当前位置: 首页 > news >正文

如何选择网站关键词公司注册查询网

如何选择网站关键词,公司注册查询网,上海比较好的网站建设公司,公司图案设计仍然是并查集的练习 108.冗余连接系列 这是一道典型的并查集问题,并查集可以解决什么问题:两个节点是否在一个集合,也可以将两个节点添加到一个集合中。 理解题意,转化问题,把题中所给的边逐个相连,如果在…

        仍然是并查集的练习

108.冗余连接系列

        这是一道典型的并查集问题,并查集可以解决什么问题:两个节点是否在一个集合,也可以将两个节点添加到一个集合中。

        理解题意,转化问题,把题中所给的边逐个相连,如果在尝试连接的时候出现了需要连接的两个边在集合中出现过,则为冗余边(简单理解就是无向图,不能出现环)

        增加对于join函数的理解,连接之后必定在一个集合中,同一个集合中元素的根必定相同

father = list()def find(u):if u == father[u]:return uelse:father[u] = find(father[u])return father[u]def is_same(u, v):u = find(u)v = find(v)return u == vdef join(u, v):u = find(u)v = find(v)if u != v:father[u] = vif __name__ == "__main__":# 輸入n = int(input())for i in range(n + 1):father.append(i)# 尋找冗余邊    result = Nonefor i in range(n):s, t = map(int, input().split())if is_same(s, t):result = str(s) + ' ' + str(t)else:join(s, t)# 輸出print(result)

109.冗余连接系列②

        本题相对较难

        这道题的本质是:删除“环”,但是有向图中的“环”,不仅仅是“顺序联通的”,还有“非顺序联通的”

        题目规定:有向树的性质,如果是有向树的话,只有根节点入度为0,其他节点入度都为1

  • 情况一:如果我们找到入度为2的点,那么删一条指向该节点的边就行了。选择删顺序靠后便可。
  • 情况二:入度为2 还有一种情况——只能删特定的一条边,综上,如果发现入度为2的节点,我们需要判断 删除哪一条边,如果是删哪个都可以,优先删顺序靠后的边。
  • 情况三: 如果没有入度为2的点,说明 图中有环了(注意是有向环),和上题思路一致
from collections import defaultdict# 全局变量,用于存储每个节点的父节点,实现并查集数据结构
father = list()def find(u):"""查找节点u的根节点,同时进行路径压缩优化路径压缩可以加快后续的查询速度"""if u == father[u]:# 如果u是自身的父节点,说明u是根节点return uelse:# 递归查找父节点的根节点,并将u的父节点直接指向根节点(路径压缩)father[u] = find(father[u])return father[u]def is_same(u, v):"""判断两个节点是否属于同一个集合(是否具有相同的根节点)"""u = find(u)v = find(v)return u == vdef join(u, v):"""将两个节点所在的集合合并"""u = find(u)v = find(v)if u != v:# 如果根节点不同,则将其中一个根节点的父节点指向另一个根节点father[u] = vdef is_tree_after_remove_edge(edges, edge, n):"""判断移除指定边后,剩余的边是否能构成一棵树edges: 所有边的列表edge: 要移除的边的索引n: 节点总数"""# 声明使用全局变量fatherglobal father # 初始化并查集,每个节点的父节点初始化为自身father = [i for i in range(n + 1)]for i in range(len(edges)):# 跳过要移除的边if i == edge:continues, t = edges[i]if is_same(s, t):# 如果两个节点已经在同一集合中,添加这条边会形成环,不能构成树return Falseelse:# 将两个节点合并到同一集合join(s, t)# 所有边处理完毕后没有形成环,说明可以构成树return Truedef get_remove_edge(edges):"""当图中存在环但没有入度为2的节点时,找到构成环的边并返回此时删除环中的任意一条边都可使图成为树"""# 声明使用全局变量fatherglobal father# 初始化并查集father = [i for i in range(n + 1)]for s, t in edges:if is_same(s, t):# 找到构成环的边,直接输出并返回print(s, t)returnelse:# 合并两个节点join(s, t)if __name__ == "__main__":# 读取节点数量n = int(input())edges = list()# 用于记录每个节点的入度in_degree = defaultdict(int)# 读取所有边并记录入度for i in range(n):s, t = map(int, input().split())in_degree[t] += 1  # 目标节点t的入度加1edges.append([s, t])# 寻找入度为2的节点对应的边,并记录这些边的索引vec = list()# 从后往前遍历,确保后续判断时优先考虑靠后的边for i in range(n - 1, -1, -1):if in_degree[edges[i][1]] == 2:vec.append(i)# 根据不同情况输出结果if len(vec) == 2:# 情况一:存在入度为2的节点,尝试删除输出顺序靠后的边if is_tree_after_remove_edge(edges, vec[0], n):print(edges[vec[0]][0], edges[vec[0]][1])# 情况二:删除第一条边不行,只能删除另一条导致入度为2的边else:print(edges[vec[1]][0], edges[vec[1]][1])else:# 情况三:不存在入度为2的节点,说明原图有环,找到构成环的边并删除get_remove_edge(edges)

http://www.dtcms.com/a/442616.html

相关文章:

  • AmberTools25 发布
  • 【ROS2学习笔记】Launch 文件
  • 网站建设推广襄樊电子商务网站建设管理答案
  • 电子商务网站建设需要多少钱怎样注册企业邮箱
  • HTML 表格
  • 在JavaScript / HTML中,转移字符导致js生成的html出错
  • 手机网站格式商城jsp可以做网站首页吗
  • Docker 完整教程 | 从基础到实战(3,4)
  • 报告网站开发环境网站想做个链接怎么做
  • wordpress 站内搜索慢开源低代码
  • Sass 与 Bootstrap 5的区别是什么?
  • 福州+网站建设+医疗wordpress干嘛用的
  • o2o网站平台怎么做wordpress 3.8.1 漏洞
  • Linux根目录结构清单:一文掌握“伪目录”与19个关键文件夹
  • 总结网站推广策划书的共同特点广告网站模板下载 迅雷下载不了
  • 网站域名骗子做静态网站选用什么服务器
  • 老题新解|正常血压
  • WebRTC 入门与实战(一)之初级篇
  • 福州网站建设好的公司网站加入地图导航
  • directadmin备份网站wordpress用户名的要求
  • 网站设计文字大小wordpress类似于
  • 邹晓辉Z与其AI智能体A示范人机互助概要科普介绍:融智学三部曲
  • 中国高铁车型简记
  • Spring IOC , DI 和 应用分层
  • 现代化文件下载器
  • AI大模型微调教程6
  • Python函数返回多个值完全指南:从基础到高级实战
  • 好的手表网站wordpress 微信 主题制作
  • 「机器学习笔记2」机器学习系统设计:从理论到实践
  • 北京网站建设公司华网制作移动端网站价格