当前位置:   article > 正文

代码随想录算法训练营第五十六天|108.冗余连接 、109.冗余连接II

代码随想录算法训练营第五十六天|108.冗余连接 、109.冗余连接II

108. 冗余连接

  1. init 方法重新初始化并查集,使每个节点的父节点指向自己。

  2. find 方法实现寻根操作,并应用了路径压缩技术,递归地将直接或间接的父节点指向根节点,优化了查找效率。

  3. is_same 方法判断两个节点是否在同一个集合中,通过比较它们的根节点是否相同。

  4. join 方法将两个节点加入同一个集合。首先寻找两个节点的根节点,如果根节点相同则直接返回,否则将一个节点的根设置为另一个节点的根。

  5. main 函数读取节点数量 n,初始化并查集,然后循环读取每对节点 st。如果 st 在同一个集合中,则打印它们并退出循环;如果不在,则通过 join 方法将它们合并。

  1. class UnionFind:
  2. def __init__(self, n):
  3. self.n = n
  4. self.father = [i for i in range(n+1)] # 按照节点大小范围定义数组
  5. def init(self):
  6. # 并查集初始化,每个节点的父节点指向自己
  7. self.father = [i for i in range(self.n+1)]
  8. def find(self, u):
  9. # 并查集里寻根的过程,路径压缩
  10. if u != self.father[u]:
  11. self.father[u] = self.find(self.father[u]) # 递归地进行路径压缩
  12. return self.father[u]
  13. def is_same(self, u, v):
  14. # 判断 u 和 v 是否找到同一个根
  15. return self.find(u) == self.find(v)
  16. def join(self, u, v):
  17. # 将 v 和 u 合并到同一个集合中
  18. root_u = self.find(u)
  19. root_v = self.find(v)
  20. if root_u == root_v:
  21. return # 如果已经在同一个集合,则直接返回
  22. self.father[root_v] = root_u # 否则,将 v 的根的父节点设置为 u 的根
  23. def main():
  24. n = int(input())
  25. union_find = UnionFind(n)
  26. union_find.init()
  27. for _ in range(n):
  28. s, t = map(int, input().split())
  29. if union_find.is_same(s, t):
  30. print(s, t)
  31. break # 找到则输出并退出
  32. else:
  33. union_find.join(s, t)
  34. if __name__ == "__main__":
  35. main()

109. 冗余连接II

本题的本质是 :有一个有向图,是由一颗有向树 + 一条有向边组成的 (所以此时这个图就不能称之为有向树),现在让我们找到那条边 把这条边删了,让这个图恢复为有向树。

还有“若有多条边可以删除,请输出标准输入中最后出现的一条边”,这说明在两条边都可以删除的情况下,要删顺序靠后的边!

  1. class UnionFind:
  2. def __init__(self, n):
  3. self.n = n
  4. self.father = [i for i in range(n+1)] # 按照节点大小范围定义数组
  5. def init(self):
  6. # 并查集初始化,每个节点的父节点指向自己
  7. self.father = [i for i in range(self.n+1)]
  8. def find(self, u):
  9. # 并查集里寻根的过程,路径压缩
  10. if u != self.father[u]:
  11. self.father[u] = self.find(self.father[u])
  12. return self.father[u]
  13. def join(self, u, v):
  14. # 将 v 和 u 合并到同一个集合中
  15. root_u = self.find(u)
  16. root_v = self.find(v)
  17. if root_u == root_v:
  18. return
  19. self.father[root_v] = root_u
  20. def same(self, u, v):
  21. # 判断 u 和 v 是否找到同一个根
  22. return self.find(u) == self.find(v)
  23. def get_remove_edge(uf, edges):
  24. uf.init()
  25. for u, v in edges:
  26. if uf.same(u, v):
  27. print(u, v)
  28. return
  29. uf.join(u, v)
  30. def is_tree_after_remove_edge(uf, edges, delete_edge):
  31. uf.init()
  32. for i, (u, v) in enumerate(edges):
  33. if i == delete_edge:
  34. continue
  35. if uf.same(u, v):
  36. return False
  37. uf.join(u, v)
  38. return True
  39. def main():
  40. n = int(input())
  41. in_degree = [0] * (n + 1) # 记录节点入度
  42. edges = []
  43. for _ in range(n):
  44. s, t = map(int,

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/970302
推荐阅读
相关标签
  

闽ICP备14008679号