删除边/节点后查询两个节点之间是不是存在路径
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 个查询。
您必须发布您的测试图表才能更准确地衡量性能。
【讨论】:
以上是关于删除边/节点后查询两个节点之间是不是存在路径的主要内容,如果未能解决你的问题,请参考以下文章