使用Kruskal算法找到图的最小切割值

时间:2015-10-11 15:26:07

标签: java kruskals-algorithm minimum-cut

我是初学者,我正在尝试使用Java中的Kruskal算法找到图表的最小切割。

我已经到了可以读取输入的位置,并创建了具有边缘随机权重的mST&rss的2个MST的数量。我剩下要做的就是从我的MST中找出分离S和V-S需要多少次切割。这将允许我选择vertexCount ^ 2个选项中的最小值。

我想我理解正确,我应该忽略MST的最后一个边缘来获得S和V-S。但我迷失在如何计算连接S和V-S的边缘数量上。

所以我的问题是:1)vertexCount ^ 2随机MST是否足以确信它将包含最小切割? 2)如何找到连接S和V-S的边数?

PS。这是我的代码片段:

            // create weighted edge graph from input.txt
            int vertexCount, edgeCount;
            Edge edgeTemp;
            vertexCount = s.nextInt();
            edgeCount = s.nextInt();
            EdgeWeightedGraph G = new EdgeWeightedGraph(vertexCount, edgeCount);
            for (int j = 0; j < edgeCount; j++) {
                edgeTemp = new Edge(s.nextInt(), s.nextInt(), new Random().nextInt(edgeCount));
                G.addEdge(edgeTemp);
            }

            // create kruskal's mst from graph G
            for (int j = 0; j < vertexCount*vertexCount; j++) {
                KruskalMST mst = new KruskalMST(G);
                for (Edge e : mst.edges()) {
                    System.out.println(e);
                }
                System.out.println(NEWLINE);
                if (j != vertexCount*vertexCount - 2)
                    G.randomizeWeight(edgeCount);
            }  

PSS。如果这是相关的,我在编写代码时会查看 http://algs4.cs.princeton.edu/43mst/ 中的代码。

1 个答案:

答案 0 :(得分:0)

从图中获取MST时,我使用了Kruskal的算法。这意味着我必须使用union并找到方法。

每个顶点在开头都是它自己的父节点。当从图中获得不同组件的并集时,我将组合组件(包括单例)分配给单个父组件。所以当我离开S和V-S时,每个组件的所有顶点将具有相同的父级!

因此,我回到我的EdgeWeightedGraph并迭代图中的所有边(而不是MST!)。当我找到两个顶点具有不同父节点的边时,这意味着边连接分量S和V-S。每当我看到像这样的边缘时,我都会算上++。

这为我提供了图表中所需的削减总数!