【问题标题】:Graph algorithm advise: find all affected paths between two nodes图算法建议:找到两个节点之间所有受影响的路径
【发布时间】:2022-01-31 11:16:19
【问题描述】:

我正在寻找针对我心目中的任务的已知解决方案

Given:V > 100k 节点的无向​​图。大多数顶点的度数为 1-2,但其中一些可能具有多达 10-20k 条边。 我对两个顶点之间的all simple paths 或以maxLength 限制的起始顶点结束的所有路径感兴趣。路径不能包含访问过的节点,但可能在起始节点处结束。

目标:偶尔会批量更新一些图的边。我想找出感兴趣的顶点之间的哪些路线已更新。理想的形式是Iterator,但List 也可以。

实际上,我正在寻找一种被动的方式来了解受影响的路线。

可以使用任何语言实现,但更喜欢 Java/Kotlin 特定的语言:)


任何参考/相关信息将不胜感激。

我不确定这是否是 CS StackExchange 的问题,但它看起来与 SO 更相关。

【问题讨论】:

  • "路径不能包含访问过的节点"什么意思?
  • 最佳猜测:您希望两个节点之间的路径除了起点和终点外不共享任何节点。
  • @ravenspoint 是正确的,路径不应包含多个顶点(第一个/最后一个除外 - 这是一个例外)

标签: java algorithm kotlin graph-theory


【解决方案1】:

寻找两个节点之间的路径,除了起点和终点之外不共享任何节点。

  • 运行 Dijskta 以查找起点和终点之间的最短简单路径
  • 向最短路径上所有节点的入边添加较大的成本(例如 = 最大整数),开始、结束除外
  • 重复直到找不到成本小于最大整数的新路径

找出感兴趣的顶点之间的哪些路线已更新。这是微不足道的

 - Multimap of edges, keyed by route index
 - Vector of updated edges
 - Loop over updated edges
      - IF edge in multimap
           - print index of affected route

【讨论】:

  • 您好,谢谢您的回答!我认为有一个误解:单条路径不能多次包含同一个顶点,但两个节点之间的多条路径可以(并且应该)
  • 我无法理解你的意思!为什么不在小图上提供一个示例
  • Dijsktra 找到的路径不会多次包含相同的顶点。
  • 公平,点。我会草绘一些东西并更新问题
  • 我从您包含的定义中看到,“简单”路径是仅访问路径上的节点的路径。重复一遍:Dijsktra 不会生成在这个意义上不简单的路径。
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2017-08-21
  • 1970-01-01
  • 2015-09-15
相关资源
最近更新 更多