删除边/节点后查询两个节点之间是不是存在路径

Posted

技术标签:

【中文标题】删除边/节点后查询两个节点之间是不是存在路径【英文标题】:Query check if there's a path between 2 nodes after an edge / node is removed删除边/节点后查询两个节点之间是否存在路径 【发布时间】:2021-12-10 22:04:47 【问题描述】:

问题:

给定一个有 N 个节点和 M 个边的无向图。给定 Q 个查询,有 2 种查询类型:

1 - A - B - U - V

删除边U-V后检查节点A和B之间是否有路径

2 - A - B - X

删除节点X后检查节点A和B之间是否有路径

约束:

N <= 100000
M <= 500000
Q <= 100000

P/S:

我认为删除后 A 和 B 之间存在路径的唯一方法是 A、B 在同一个Biconnected Component 或边缘/节点不是桥/弧。

但是由于我们对于每个查询只有 logN 时间(因为最多有 100.000 个查询),我无法找到一种方法来检查 A、B 是否在 O(logN) 中的同一个双连通分量中。

有办法吗?或者这个问题有不同的解决方案吗?

【问题讨论】:

https://en.wikipedia.org/wiki/Dynamic_connectivity#Fully_dynamic_connectivity? 你在正确的轨道上;它是原始图上的双连接组件,最不常见的祖先,以及一大堆细节。 (@גלעדברקן,这些算法也可以工作,但它们在 IMO 更复杂,而且常量很糟糕。) 【参考方案1】:

执行此操作的简单方法是深度优先搜索,从 A 开始,如果到达 B,则停止并返回 true,如果无法到达 B,则返回 false。

了解您的实际性能要求(以秒为单位)会很有用。

PathFinder Graph Theory Engine 可以检查两个随机节点是否连接在包含 403,394 个节点和 3,387,388 个链接的图中,平均时间为 0.14 秒(不同随机节点的 100 次测试)

您的图表大约小 4 到 10 倍,所以我想它可以在十分之一秒内完成。

对于不到 3 小时的 100,000 个查询。

您必须发布您的测试图表才能更准确地衡量性能。

【讨论】:

以上是关于删除边/节点后查询两个节点之间是不是存在路径的主要内容,如果未能解决你的问题,请参考以下文章

找到两个节点(顶点)之间的最短路径

2816. [ZJOI2012]网络LCT

在java中使用gremlin获取两个节点之间的所有路径

找到两个给定节点之间的路径?

如何使用密码删除两个节点之间的重复关系?

51nod1076 (边双连通)