有向图的图邻接定义在Java中实现Dijkstra算法?

时间:2013-11-15 22:54:41

标签: graph dijkstra directed-graph adjacency-list

我正在使用directed graph实现代码以获取Dijkstra's algorithm中的短路径,如下所示?enter image description here

我的问题是

  1. 如何为顶点定义adjacency list? 在我目前的代码中,我只考虑了邻接列表部分的外发边缘

  2. 如果图中有循环模式,Dijkstra的算法是否会失败?例如,ABD在

  3. 下面形成一个循环
  4. 如果没有来自顶点的外边缘,那么从该顶点起没有最短路径作为源,例如:对于下图,如果我想找到从F到A的最短路径,则没有。 Dijsktra算法应该解决这个问题吗?
  5. 我已经实现了Dijsktra的算法,但我没有在这里粘贴代码。澄清这些疑虑之后,我将就Dijkstra的实施问题发表一个单独的问题。

    我目前的顶点,边缘和图形代码如下。您可以注意到,我已经为上面的图像定义了顶点和邻接列表。如果附属清单正确,请通过您的意见。 例如:顶点F没有邻接列表,因为它没有外边缘。

    class Vertex implements Comparable<Vertex>
    {
        public final String name;
        public Edge[] adjacencies;
        public double minDistance = Double.POSITIVE_INFINITY;
        public Vertex previous;
        public Vertex(String argName) { name = argName; }
        public String toString() { return name; }
        public int compareTo(Vertex other)
        {
            return Double.compare(minDistance, other.minDistance);
        }
    }
    
    class Edge
    {
        public final Vertex target;
        public final double weight;
        public Edge(Vertex argTarget, double argWeight)
        { target = argTarget; weight = argWeight; }
    }
    public class Graph { 
    public static void main(String[] args) {
            Vertex A = new Vertex("A");
            Vertex B = new Vertex("B");
            Vertex C = new Vertex("C");
            Vertex D = new Vertex("D");
            Vertex E = new Vertex("E");
            Vertex F = new Vertex("F");
            Vertex G = new Vertex("G");
    
            A.adjacencies = new Edge[]{ new Edge(B, 1)};
            B.adjacencies = new Edge[]{ new Edge(C, 3), new Edge(D, 2)};
            C.adjacencies= new Edge[]{new Edge(D, 1),new Edge(E, 4)};
            D.adjacencies= new Edge[]{new Edge(E, 2),new Edge(A, 2) };
            E.adjacencies= new Edge[]{new Edge(F, 3) };
            //F.adjacencies= null;
            G.adjacencies= new Edge[]{new Edge(D, 1)};
    
        }
    }
    

1 个答案:

答案 0 :(得分:0)

  1. 仅使用传出边缘。

  2. 没有。算法的良好实现没有循环问题。在算法中,不可能出现循环问题,因为节点越来越“消除”,并且消除了许多边缘。

  3. 是。算法将处理这个问题。在开始之前,您必须确保正确设置了所有中间信息,例如,您需要能够识别是否删除了节点。在算法中,您需要选择要开始的节点,如果节点没有相邻节点,则其他节点(例如A)将previous属性设置为{{ 1}}。更容易实施null