我有一个图表,其中我有两个节点(0和6),我必须尽可能减少边缘,以便它们不连接。例如,在此图中
作为节点0和6,我必须切割的最小边是2-7和3-7。 我的想法是找到两者之间使用bfs的最短路径,我找到一个(0-2-7-6),但后来我不知道如何找到另一个(0-3-7-6)。即便如此,我也不知道如何选择切割边缘。
如果有人能就此事给我一些指示,那就太好了。
答案 0 :(得分:2)
此问题似乎与在图中查找清晰度节点的问题非常相似。关节点或双连通组件的技术定义是一个节点,其移除会导致图形被分成两部分。
从图表中发现关节点是一个很大程度上解决的问题,您可以在此处找到有关它的更多详细信息:http://en.wikipedia.org/wiki/Biconnected_component
在我看来,你想要像这样处理这样的问题的方式将是这样的:
1. Find all articulation points
2. Do a bfs from each node and determine articulation points along the path
3. Split graph at the articulation point, choosing the side with minimal edges
4. Continue until the two nodes are not connected
在上面的示例中,7是唯一的关节点,因此您将在7,2和3之间剪切边缘,因为在7和0-4图之间只有两条边,在7和5之间只有3条边, 6,8图。
有一个更成熟的算法(阅读:我没有提出的算法)称为Karger的算法可以解决你的问题,虽然在n ^ 2时间。
该算法通过有效地将相邻节点彼此连接直到只有两个节点然后通过计算两个节点之间留下的边数来工作。然后,边数是分割图形所需的最小切割数。
在问题中实现Karger算法的方法只需要注意,您应该始终将节点加入要分割的两个节点。此外,为了能够向后移动到原始边缘,您需要剪切,您应该保留对边缘最初属于哪些节点的引用。
这里有一个很棒的Karger算法可视化:http://en.wikipedia.org/wiki/Karger%27s_algorithm
答案 1 :(得分:2)
你想要的是最小切割。在一般图中找到一个的常用方法是运行像push relabel这样的算法,其中包含源0和接收器6,它计算最小s-t切割作为计算最大流量的副产品。
Karger算法找到最小切割,即最小化s和t以及切割。由于s和t是固定的,因此Karger是不合适的。铰接顶点是一个顶点,其删除会断开图形。您有兴趣删除边,而不是顶点。