【问题标题】:Disconnecting a connected graph断开连通图
【发布时间】:2023-03-19 04:35:01
【问题描述】:

我需要找到需要从连接图中删除的最小边数(可能有循环并且具有未加权的无向边),以便我最终得到两个给定的节点 - A 和 B 在单独的不连接部分中。

输入:边,节点 A,节点 B。(从 A 到 B 至少存在 1 条路径) 输出:要移除的最小边数,以便 A 和 B 之间没有路径

我只能想到最坏的解决方案:-

best = no. of edges in the given connected graph G
For each possible subset S of Edges in the given connected graph G
   Graph temp = G minus edges S
   if there exists a path between A and B in temp
       continue
   else
        best = Min(best, no. of edges in S)
return best

我正在寻找一种解决方案,它可以在一两秒内轻松处理具有 15 个顶点的图形。 我想知道我的解决方案是否足够好。

谢谢!

附:我不确定我的解决方案的大 O 复杂度是 2^n 还是 n*(2^n) 或 (n^2)*(2^n)。我认为是后者,但我想确定。

【问题讨论】:

    标签: algorithm graph graph-algorithm


    【解决方案1】:

    您可以使用maximum flow algorithm 计算图表中 A 和 B 之间的最小切割。

    运行时:O(n*m),带有过度缩放的 push-relabel 变体(因为您只有单位容量)。

    如果您使用 DFS 或 BFS 在固定子图中实现可达性,则您的解决方案是 O(2^m * (n + m))。

    【讨论】:

    • 感谢您的超级快速回答。不过,维基百科的文章让我很头疼。但我在读书。我想我真的需要学习更多的图论基础
    • @user3557625 对于初学者,您可能想看看Edmonds-Karp,这是一个简单但相当有效的最大流算法。您也可以使用一个库,大多数图形算法库应该能够解决最大流:)
    • 另外,如果您能评论我的伪代码,我将不胜感激 - 即,如果它甚至算作一个解决方案。如果是这样,对于 n~15,它可能会慢得令人无法接受吗?当然,一旦我了解了最大流量算法,我就不再需要它了!
    • @user3557625 如果图是连通的,那么您的伪代码更多地取决于边数而不是节点数。类似于 m*2^m ,其中 m 是边数,所以是的,如果 m 超过 25 左右,它很快就会失控
    猜你喜欢
    • 2019-04-07
    • 2019-05-31
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2020-10-16
    相关资源
    最近更新 更多