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