繁体   English   中英

剪切特定边缘时,如何检查不可达子图的存在?

[英]How can I check unreachable subgraph exists when I cut the specific edge?

我要解决的问题:

如果要剪切特定的边缘,我想在给定的有向图中检测新创建的不可达子图(标记不可达节点)。

这个问题的局限性:

  • 给定的图是有向图 (请参阅下面的有用信息。)
  • 节点数超过100,000
  • 边的数量大约是节点的1.5倍
  • 解决方案的运行时间应少于一秒

可能有用的信息:

  • 给定的图是通过连接多个循环制成的。 并且,从任何节点到其他节点至少存在1条路由。
  • 少数(〜10%)节点具有分支。 图中节点上的边缘不超过3个
  • “无法到达的区域”的含义包括“未连接”, 但是如果您认为这将两个不同的问题混为一谈,则可以忽略这一点。

我的审判

当我遇到这个问题时,我尝试了4种方法,但是没有比这更好的了。

  1. 找到另一个可以替换剪切节点的路径。

由于该方法的运行时间而拒绝该方法。 当前,我们使用Dijkstra算法进行查找,当我通过将其放入作业队列尝试使用此方法时,作业队列在不到一个小时的时间内就被淹没了。

  1. 检查边缘级别(例如数据包的网络生存时间)。
Search from edge node with given threshold level.
If I met the branch, keep previous level. Otherwise, decrease level.
If level is 0, do nothing.

当前的时间解决方案就是这一解决方案,但显然,这一解决方案忽略了很多极端情况。

  1. 将流量网络模拟到图形。

这很简单:

Give a threshold(like 100) to every nodes and simulate its flow.
If I met the branch, split number into each branch.
Check the values that is lower than 1.

但是由于时间的复杂性,这种方法也被拒绝了。

  1. SCC和拓扑排序。

最后,我按拓扑顺序检查了强连接组件。 我当然知道我使用了错误的单词,请参阅下文)

这个想法是,拓扑排序用于DAG (有向无环图),但是如果我添加了一些规则(例如“如果我检测到循环,则使用SCC将该循环作为一个虚拟节点递归对待”),则可以检查一般有向图的“拓扑顺序” 如果找到拓扑顺序,则意味着存在一个无法访问的区域。 (很难说,可以用方法3来思考:模拟流动网络)

我认为这种方法是最好的方法,也许可以解决问题,但是我对应该搜索和了解的关键字没有任何想法。 与实现相同。

编辑

我忘记了无法达到的手段的解释。 如果没有从节点(节点“ A”)到任何其他节点的路由,则节点“ A”为“ unreachable” 最初,在给定的图上,不存在不可达节点。

在此问题中,我们假设节点1是主节点。 如果没有从节点1到节点2的路由,则节点2不可达。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM