【发布时间】:2015-10-11 15:26:07
【问题描述】:
我是一名初学者,我正在尝试使用 Java 中的 Kruskal 算法找到图的最小分割。
我已经到了可以读取输入并为边缘创建随机权重的 vertexCount^2 个 MST 的位置。我剩下要做的就是从我的 MST 中计算出分离 S 和 V-S 需要多少次切割。这将允许我从 vertexCount^2 个选项中选择最小值。
我想我理解正确,我应该忽略 MST 的最后一条边以获得 S 和 V-S。但是我不知道如何弄清楚有多少条边连接了 S 和 V-S。
所以我的问题是:1) vertexCount^2 随机 MST 是否足以确信它将包含最小切割? 2) 我怎样才能找到连接 S 和 V-S 的边数?
PS。这是我的代码的 sn-p 形式:
// 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/ 中的代码。
【问题讨论】:
标签: java kruskals-algorithm minimum-cut