我正在使用directed graph
实现代码以获取Dijkstra's algorithm
中的短路径,如下所示?
我的问题是
如何为顶点定义adjacency list
?
在我目前的代码中,我只考虑了邻接列表部分的外发边缘
如果图中有循环模式,Dijkstra的算法是否会失败?例如,ABD在
我已经实现了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)};
}
}
答案 0 :(得分:0)
仅使用传出边缘。
没有。算法的良好实现没有循环问题。在算法中,不可能出现循环问题,因为节点越来越“消除”,并且消除了许多边缘。
是。算法将处理这个问题。在开始之前,您必须确保正确设置了所有中间信息,例如,您需要能够识别是否删除了节点。在算法中,您需要选择要开始的节点,如果节点没有相邻节点,则其他节点(例如A
)将previous
属性设置为{{ 1}}。更容易实施null