我正在尝试编写一个程序,该程序将使用 Kruskal 和 Prim 算法找到给定无向加权图的 MST。我已经在程序中成功地实现了 Kruskal 的算法,但是我遇到了 Prim 的问题。更准确地说,我不知道如何实际构建 Prim 函数,以便它遍历图中的所有顶点。我在程序执行期间遇到了一些 IndexOutOfBoundsException 错误。我不确定其他人需要多少信息才能了解我到目前为止所做的事情,但希望不会有太多无用的信息。
这是我到目前为止所拥有的:
我有一个Graph
,Edge
和一个Vertex
类。
顶点类大多只是一个包含顶点名称(编号)的信息存储。
Edge 类可以创建一个具有获取参数的新 Edge
(Vertex start, Vertex end, int edgeWeight)
。该类具有返回通常信息的方法,例如开始顶点、结束顶点和权重。Graph 类从文本文件中读取数据并将新边添加到 ArrayList。文本文件还告诉我们图形有多少个顶点,并且也被存储了。
在Graph
课堂上,我有一个 Prim() - 应该计算 MST 的方法:
public ArrayList<Edge> Prim(Graph G) {
ArrayList<Edge> edges = G.graph; // Copies the ArrayList with all edges in it.
ArrayList<Edge> MST = new ArrayList<Edge>();
Random rnd = new Random();
Vertex startingVertex = edges.get(rnd.nextInt(G.returnVertexCount())).returnStartingVertex(); // This is just to randomize the starting vertex.
// This is supposed to be the main loop to find the MST, but this is probably horribly wrong..
while (MST.size() < returnVertexCount()) {
Edge e = findClosestNeighbour(startingVertex);
MST.add(e);
visited.add(e.returnStartingVertex());
visited.add(e.returnEndingVertex());
edges.remove(e);
}
return MST;
}
findClosesNeighbour() 方法如下所示:
public Edge findClosestNeighbour(Vertex v) {
ArrayList<Edge> neighbours = new ArrayList<Edge>();
ArrayList<Edge> edges = graph;
for (int i = 0; i < edges.size() -1; ++i) {
if (edges.get(i).endPoint() == s.returnVertexID() && !visited(edges.get(i).returnEndingVertex())) {
neighbours.add(edges.get(i));
}
}
return neighbours.get(0); // This is the minimum weight edge in the list.
}
ArrayList<Vertex> visited
并ArrayList<Edges> graph
在创建新图形时构建。
Visited() - 方法只是一个布尔检查,看看 ArrayList 是否包含我们正在考虑移动到的顶点。我findClosestNeighbour()
独立测试了它,它似乎正在工作,但如果有人发现它有问题,那么也欢迎反馈。
主要是正如我提到的,我的问题是在 Prim() 方法中实际构建主循环,如果需要任何其他信息,我很乐意提供。
谢谢你。
编辑:澄清我的 Prim() 方法的思路是什么。我想要做的是首先随机化图中的起点。之后,我会找到离该起点最近的邻居。然后我们将连接这两个点的边添加到 MST,并将顶点添加到访问列表中以供稍后检查,这样我们就不会在图中形成任何循环。
这是引发的错误:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at Graph.findClosestNeighbour(graph.java:203)
at Graph.Prim(graph.java:179)
at MST.main(MST.java:49)
第 203 行:return neighbour.get(0);
在 findClosestNeighbour() 中
第 179 行:Edge e = findClosestNeighbour(startingVertex);
在 Prim() 中