Algorithm 创建平面图的对偶

Algorithm 创建平面图的对偶,algorithm,graph-algorithm,Algorithm,Graph Algorithm,当我试图建立一个MSSP(多源最短路径)时,我看到了这一点,但我缺乏如何建立互调树的知识。直到现在,我创建了生成树,因此创建了平面图,但是我被卡住了,因为我不知道如何构建它的对偶。有没有什么具体的算法/方法或论文可以帮助我解决这个问题?当我搜索时,没有发现任何有用的东西 如果你还没有,你需要一个组合嵌入。有一些有效的算法可以从关联结构中获得一个,但是平面图的自然源通常具有自然嵌入。有许多方法可以表示嵌入。我使用了一个置换π映射,以逆时针顺序将每个半边映射到下一个半边,头部顶点相同。与每个(非孤立

当我试图建立一个MSSP(多源最短路径)时,我看到了这一点,但我缺乏如何建立互调树的知识。直到现在,我创建了生成树,因此创建了平面图,但是我被卡住了,因为我不知道如何构建它的对偶。有没有什么具体的算法/方法或论文可以帮助我解决这个问题?当我搜索时,没有发现任何有用的东西

  • 如果你还没有,你需要一个组合嵌入。有一些有效的算法可以从关联结构中获得一个,但是平面图的自然源通常具有自然嵌入。有许多方法可以表示嵌入。我使用了一个置换π映射,以逆时针顺序将每个半边映射到下一个半边,头部顶点相同。与每个(非孤立)顶点关联的是传入半边的循环链接列表

  • 假设rev是一种排列,它将每一半边映射到另一半边,并具有相反的头部和尾部顶点。对偶图的嵌入置换是π和rev的组合。它以顺时针顺序将每个半边映射到面上的下半边(或在无限面上逆时针映射,因为您看到的是它的背面)。如果你亲自尝试一些例子,这会更清楚

  • 从初始根计算最短路径后(我使用Dijkstra,除非MSSP实现比我快得多,否则使用渐进更快的算法不会有太大的相对改进),进行深度优先搜索,忽略属于最短路径树的边。(另一种选择是以Euler巡更顺序访问叉指树的半边,但这种方法似乎会导致额外的对数时间动态树操作。)

  • 如果你还没有,你需要一个组合嵌入。有一些有效的算法可以从关联结构中获得一个,但是平面图的自然源通常具有自然嵌入。有许多方法可以表示嵌入。我使用了一个置换π映射,以逆时针顺序将每个半边映射到下一个半边,头部顶点相同。与每个(非孤立)顶点关联的是传入半边的循环链接列表

  • 假设rev是一种排列,它将每一半边映射到另一半边,并具有相反的头部和尾部顶点。对偶图的嵌入置换是π和rev的组合。它以顺时针顺序将每个半边映射到面上的下半边(或在无限面上逆时针映射,因为您看到的是它的背面)。如果你亲自尝试一些例子,这会更清楚

  • 从初始根计算最短路径后(我使用Dijkstra,除非MSSP实现比我快得多,否则使用渐进更快的算法不会有太大的相对改进),进行深度优先搜索,忽略属于最短路径树的边。(另一种选择是以Euler巡更顺序访问叉指树的半边,但这种方法似乎会导致额外的对数时间动态树操作。)


  • 根据网上找到的论文,我可以通过使用euler巡更图创建平面图,因此我对代码进行了安排,以便每次更改都可以在logn中完成。就像动态树一样。如果您使用dijkstra,则意味着您将具有n^2*n^2复杂性。是的,但我发现很难理解euler tour raph的操作如何与链接/切割树一起工作。因为它们可以用作叉指树。因为euler图不能存储有关路径的信息。非常感谢你的帮助。我只在初始化期间使用Dijkstra一次。MSSP的渐近运行时间仍然是O(n logn)。平面图有一个线性时间最短路径算法,但由于计算初始最短路径树只占总运行时间的一小部分,因此即使该步骤的运行时间为零,也没有多少改进。2.Euler巡更树不适用,因为它们不支持路径操作。我的意思是,你可以不使用堆栈就枚举叉指树的半边。根据网上找到的论文,我可以通过使用euler巡更图创建平面图,因此我对代码进行了安排,以便每次更改都可以在log n中完成。就像动态树一样。如果您使用dijkstra,则意味着您将具有n^2*n^2复杂性。是的,但我发现很难理解euler tour raph的操作如何与链接/切割树一起工作。因为它们可以用作叉指树。因为euler图不能存储有关路径的信息。非常感谢你的帮助。我只在初始化期间使用Dijkstra一次。MSSP的渐近运行时间仍然是O(n logn)。平面图有一个线性时间最短路径算法,但由于计算初始最短路径树只占总运行时间的一小部分,因此即使该步骤的运行时间为零,也没有多少改进。2.Euler巡更树不适用,因为它们不支持路径操作。我的意思是,您可以枚举叉指树的半边,而无需使用堆栈。