Prim';s算法在Java中的实现

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

我正试图用Java实现Prim的算法,使用graph HashMap+LinkedList和一个包含连接顶点和权重的类边:

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;