Prim';s算法在Java中的实现
我正试图用Java实现Prim的算法,使用graph HashMap+LinkedList和一个包含连接顶点和权重的类边:Prim';s算法在Java中的实现,java,data-structures,graph,minimum-spanning-tree,prims-algorithm,Java,Data Structures,Graph,Minimum Spanning Tree,Prims Algorithm,我正试图用Java实现Prim的算法,使用graph HashMap+LinkedList和一个包含连接顶点和权重的类边: adjacencyList = new HashMap<T, LinkedList<Edge<T>>>(); 正如我之前所说的,我不知道我是否应该返回一个图作为MST(可能是我作为输入删除最昂贵的边而给出的图)或者一个名为path的LinkedList,它以最小的权重保存路径。 我也不知道如何在MST中找到边的数量;我应该为每个顶点(H
adjacencyList = new HashMap<T, LinkedList<Edge<T>>>();
正如我之前所说的,我不知道我是否应该返回一个图作为MST(可能是我作为输入删除最昂贵的边而给出的图)或者一个名为path的LinkedList,它以最小的权重保存路径。
我也不知道如何在MST中找到边的数量;我应该为每个顶点(HashMap的键集)找到LinkedList的大小(这是它的值)并将它们相加吗
编辑:获取邻接顶点方法
public LinkedList<T> getAdjacentVertices(T vertex) {
if (adjacencyList.isEmpty() || adjacencyList.containsKey(vertex) == false) {
System.out.println("Error msg.\n");
return null;
} else {
LinkedList<T> allAdjacents = new LinkedList<>();
for (Edge<T> edge : adjacencyList.get(vertex)) {
allAdjacents.add(edge.getDestination());
}
return allAdjacents;
}
}
公共链接列表GetAdjacentVertex(T顶点){
if(adjacencyList.isEmpty()| | adjacencyList.containsKey(顶点)==false){
System.out.println(“错误消息。\n”);
返回null;
}否则{
LinkedList allAdjacents=新LinkedList();
对于(边:邻接列表。获取(顶点)){
add(edge.getDestination());
}
返回所有相邻项;
}
}
1)我猜错误不在getVertices()
中,而是在图形
在边上被定义为泛型,而不是T
中Graph
被实例化为Graph
,因此Set
作为返回值被指定为Set
我建议您将Graph
定义为Graph
,并从中重构图形的逻辑,或者将IEdge
定义为Edge
的上界面,并将图形重新定义为Graph1)我猜错误不在getVertices()中
但事实上,您的图形
在边缘
上被定义为泛型,而不是T
Graph
被实例化为Graph
,因此Set
作为返回值被指定为Set
我建议您将Graph
定义为Graph
,并从中重构图形的逻辑,或者将IEdge
定义为Edge
的上界面,并将图形重新定义为GraphOk,为(1)工作,但不知道应该为点(2)定义哪个图形。你是指类还是最小跨度树(图,T顶点)?编辑我的答案以提供一个例子。现在我没有办法测试,但是你应该能够掌握这个过程。嗯,好吧,我想我已经掌握了,但是这会弄乱我的图形课的一半!!我想我需要找到另一个解决方案!没问题。当我可以返回空列表时,我也不会返回null;)请小心,我猜您已经编辑了列表的类型,但是没有更改添加(edge.getDestination())
。您不能将边缘添加到列表中
。此外,当在调用者中循环结果边并检查顶点是否已经包含其目的地时,获取边目的地有什么意义?您希望返回Edge
s,而不是T
s。好的,为(1)工作,但不知道应该将哪个图形定义为点(2)的图形。你是指类还是最小跨度树(图,T顶点)?编辑我的答案以提供一个例子。现在我没有办法测试,但是你应该能够掌握这个过程。嗯,好吧,我想我已经掌握了,但是这会弄乱我的图形课的一半!!我想我需要找到另一个解决方案!没问题。当我可以返回空列表时,我也不会返回null;)请小心,我猜您已经编辑了列表的类型,但是没有更改添加(edge.getDestination())
。您不能将边缘添加到列表中
。此外,当在调用者中循环结果边并检查顶点是否已经包含其目的地时,获取边目的地有什么意义?您希望返回Edge
s,而不是T
s。
public class Graph<T extends Comparable<T>> {
.
.
public Set<T> getVertices() {
if (adjacencyList.isEmpty()) {
System.out.println("Error message.\n");
return null;
} else
return adjacencyList.keySet();
}
}
Prim.java:28: error: incompatible types: T cannot be converted to Edge<T>
for (Edge<T> edge : graph.getAdjacentVertices(source)) {
^
where T is a type-variable:
T extends Comparable<T> declared in class Prim
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
public class Prim<T extends Comparable<T>> {
public <SHOULD I RETURN graph ?> minimumSpanningTree(Graph<Edge<T>> graph, T vertex) {
//ArgumentException
double weight = 0;
T source = vertex;
LinkedList<T> vertexSet = new LinkedList<>();
LinkedList<Edge<T>> path = new LinkedList<>();
vertexSet.addAll(graph.getVertices()); //unvisited ERROR HERE
vertexSet.remove(source);
double numberOfVertices = graph.getVertices().size();
PriorityQueue<Edge<T>> priorityQueue = new PriorityQueue<>();
while (!vertexSet.isEmpty()) {
for (Edge<T> edge : graph.getAdjacentVertices(source)) {//ERROR
if (vertexSet.contains(edge.getDestination()))
priorityQueue.insert(edge);
}
Edge<T> minWeight = priorityQueue.extractMin();
weight += minWeight.getWeight();
path.add(HERE I SHOULD PUT MST PATH BUT I DON'T KNOW HOW!!);
source = minWeight.getDestination();
vertexSet.remove(source);
}
return <graph??>;
}
}
public LinkedList<T> getAdjacentVertices(T vertex) {
if (adjacencyList.isEmpty() || adjacencyList.containsKey(vertex) == false) {
System.out.println("Error msg.\n");
return null;
} else {
LinkedList<T> allAdjacents = new LinkedList<>();
for (Edge<T> edge : adjacencyList.get(vertex)) {
allAdjacents.add(edge.getDestination());
}
return allAdjacents;
}
}
public class Graph<T> {
Map<T, Edge<T>> adjacencyList;
public Set<T> getVertices() {
if (adjacencyList.isEmpty()) {
System.out.println("Error message.\n");
return null;
} else {
return adjacencyList.keySet();
}
}
}
Graph<Point> p;
List<Point> points = new LinkedList<>();
points.addAll(p.getVertices());
for (Edge<T> edge : graph.getAdjacentVertices(source))
LinkedList<Edge<T>> allAdjacents = new LinkedList<>();
for (Edge<T> edge : adjacencyList.get(vertex)) {
allAdjacents.add(edge);
}
return allAdjacents;