具有非负权重的有向图(邻接矩阵)
Directed graph with non negative weights (adjacency matrix)
首先,我为我绘制的图表不当而道歉。权重显然没有缩放。我很难想出解决一些问题的算法。
首先,我想找到所有从 C 到 C 需要 3 "stops" 或更少的路径(只是一个例子......可以是任何两个顶点)。经过研究,我发现 BFS 可能是我正在寻找的解决这个问题的方法。我的这个假设是否正确?
有两条路径不超过 3 个站点:
C -> D -> C
C -> E -> B -> C
我也想找到从A到C的最短路径(只是一个例子..可以是任意两个顶点)。在做了一些研究之后,我得出的结论是我应该使用 Dijkstra 算法。我的这个假设是否正确?如果是这样,我看到有多种实现方式。我使用二叉堆、斐波那契堆还是队列有关系吗?
谢谢,如果您需要更多信息,请告诉我!
First, I want to find all paths that take 3 "stops" or less from C to
C (just an example... can be any two vertexes). After researching, I
found that BFS might be what I'm looking for to solve this problem. Am
I correct in this assumption?
是的,你是。 BFS的属性是按照level-order处理节点,因此首先处理所有与源节点相邻的节点,然后是与源节点相邻的节点等
I also want to find the shortest path from A to C (just an example..
can be any two vertexes). After doing a little bit of research, I came
to the conclusion that I should use Dijkstra's algorithm. Am I correct
in this assumption? If so, I saw that there are various
implementations. Does it matter if I use binary heap, fibonacci heap,
or queue?
同样,是的,Dijkstra 算法是此类问题的经典解决方案。还有其他算法更适合某些特殊情况(例如 Bellman-Ford,如果你的图中有负权重),但在大多数情况下(你的也是如此),请使用 Dijkstra。关于实现,理论上最好的实现是基于斐波那契堆实现的最小优先级队列。本次实现的运行次为O(|E|+|V|/log|V|)
(其中|V|
为顶点数,|E|
为边数)。但是,在实践中,二叉堆通常优于斐波那契堆,请参阅 this interesting thread 了解更多信息。
首先,我为我绘制的图表不当而道歉。权重显然没有缩放。我很难想出解决一些问题的算法。
首先,我想找到所有从 C 到 C 需要 3 "stops" 或更少的路径(只是一个例子......可以是任何两个顶点)。经过研究,我发现 BFS 可能是我正在寻找的解决这个问题的方法。我的这个假设是否正确?
有两条路径不超过 3 个站点:
C -> D -> C
C -> E -> B -> C
我也想找到从A到C的最短路径(只是一个例子..可以是任意两个顶点)。在做了一些研究之后,我得出的结论是我应该使用 Dijkstra 算法。我的这个假设是否正确?如果是这样,我看到有多种实现方式。我使用二叉堆、斐波那契堆还是队列有关系吗?
谢谢,如果您需要更多信息,请告诉我!
First, I want to find all paths that take 3 "stops" or less from C to C (just an example... can be any two vertexes). After researching, I found that BFS might be what I'm looking for to solve this problem. Am I correct in this assumption?
是的,你是。 BFS的属性是按照level-order处理节点,因此首先处理所有与源节点相邻的节点,然后是与源节点相邻的节点等
I also want to find the shortest path from A to C (just an example.. can be any two vertexes). After doing a little bit of research, I came to the conclusion that I should use Dijkstra's algorithm. Am I correct in this assumption? If so, I saw that there are various implementations. Does it matter if I use binary heap, fibonacci heap, or queue?
同样,是的,Dijkstra 算法是此类问题的经典解决方案。还有其他算法更适合某些特殊情况(例如 Bellman-Ford,如果你的图中有负权重),但在大多数情况下(你的也是如此),请使用 Dijkstra。关于实现,理论上最好的实现是基于斐波那契堆实现的最小优先级队列。本次实现的运行次为O(|E|+|V|/log|V|)
(其中|V|
为顶点数,|E|
为边数)。但是,在实践中,二叉堆通常优于斐波那契堆,请参阅 this interesting thread 了解更多信息。