可能在图中找到循环的所有错误方法

主要观点:在作者的谜题集合中,许多游戏需要连接点形成无环图,程序需检查图中是否有环及找出环的边。作者历经多种算法来解决此问题,包括顶点 dsf、图修剪、环追踪、面 dsf、步道 dsf 和 Tarjan 的桥寻找算法等,各算法有其优缺点。
关键信息

  • 顶点 dsf 用于自动求解,通过并查集数据结构跟踪顶点等价类,能高效判断是否将形成环,但不能找出环的所有边。
  • 图修剪通过迭代删除度为 1 的边来找出环,能找出所有环的边,但可能会误标记非环边。
  • 环追踪先通过顶点 dsf 找出环的边,再进行图搜索找到环的路径,能避免误标记非环边,但不能确定能找出所有环。
  • 面 dsf 利用平面图的面概念,通过并查集在面之间进行合并来找出环的边,在普通网格上效果好,但在有环绕模式的 Net 谜题中会遗漏一些环。
  • 步道 dsf 在边的两侧创建行人步道的并查集,用于判断边是否在环中,能在平面和环面上工作,但在非定向表面上会出错。
  • Tarjan 的桥寻找算法通过找到图的生成森林,再确定哪些边是桥(即不是环的边),不依赖于图的拓扑嵌入,性能较好。
    重要细节
  • 各种算法的实现细节,如顶点 dsf 中如何利用并查集跟踪等价类,图修剪中如何删除度为 1 的边等。
  • 不同谜题中应用各种算法的具体情况,如 Net、Slant、Loopy 等谜题。
  • 面 dsf 在 Net 谜题环绕模式下的局限性,以及步道 dsf 在非定向表面上的错误。
  • Tarjan 算法中找到生成森林、根化树以及确定边是否为桥的步骤和原理。
  • 对环追踪算法的改进想法,即限制追踪范围为已处理的边,可证明能找出所有环的边。
阅读 15
0 条评论