当前位置: 首页 > 知识库问答 >
问题:

具有邻接表图的Dijkstra算法

孟开宇
2023-03-14

我有一个无向加权图,作为邻接列表实现。有一个hashmap,其中节点对象作为键,边对象列表作为值。这些边对象包含两个节点之间边的权重。

我试图编写一个Dijkstra的最短路径算法;但是我担心我的图结构太复杂,无法理解我能为Dijkstra找到的所有示例/伪代码。有人能提供任何帮助吗?提前感谢。

共有2个答案

薛元忠
2023-03-14

对于Java,有许多可用的。JGraphT既简单又漂亮。荣格,JTS等。如果你是自己实现的,那么我宁愿使用LinkedHashSet,例如:

public abstract class Graphs<T, E> 
{
final LinkedHashSet<Vertex<? extends T>> allVertex;
 ...

顶点是:

/**
 * E is of the type: the kind of vertex I want to make. For example String

 */
 public interface Vertice<E>
  {
  public void setAttribute(E ob);
  public E getAttribute();
  //      public Set<Edge<?>> getConnectedVertices();
  public Set<Edge<?>> getConnectedEdges();       
  public Edge<?> getPassageToVertice(Vertice<?> vertice);
  }

边缘为:

package Graph;

   public interface Edge<E> 
   {

/**
 * Returns the attribute Associated with the Edge
 * @return The Attribute associated with the Edge
 */
public E getAttribute();

public void setSource(Vertex<?> source);

public void setDestination(Vertex<?> dest);

/**
 * Sets the attribute of the edge
 * @param attr Sets the attribute of the Edge
 */
void setAttribute(E attr);

/**
 * Get the permission to access the destination from the source.
 * <p> For example:    
 * <li>A-------edge---------B </li>
 * here A is a vertex
 *      B is a vertex
 *      edge is the edge.
 * If the argument of the method is vertex A then it returns Vertex B, if it is
 * legal to return (for ex will return B if the edge is intended to be Undirected)
 * This method can be used to create different types of Edge's.</p>
 * <p> In case of a directed edge
 * <li>A----->----edge------>B</li>
 * on calling getPassage(B) it will return null.
 * </p>
 * @param source One end of the edge
 * @return The other end of the edge if the edge has access to. Or else return null;
 */
public Vertex<?> getPassage(Vertex<?> source);

public Vertex<?> getSource();

public Vertex<?> getDestination();

}

龙安阳
2023-03-14

使用Boost图形库怎么样,也有python绑定。我认为Dijkstra最短路径就是其中一个例子。

 类似资料:
  • 本文向大家介绍Dijkstra的邻接表表示算法,包括了Dijkstra的邻接表表示算法的使用技巧和注意事项,需要的朋友参考一下 有一个给定的图G(V,E)及其邻接列表表示形式,并且还提供了一个源顶点。Dijkstra的算法,用于找到源顶点与图G的任何其他顶点之间的最小最短路径。 为了解决这个问题,我们将使用两个列表。一种是存储已被视为最短路径树的顶点,另一种将保存尚未被考虑的顶点。在算法的每个阶段

  • 我遇到了一个将Dijkstras算法的伪代码转换为实际代码的问题。我给出了邻接列表,如“位置-相邻位置-到位置的距离”,一个节点的例子:AAA AAC 180 AAD 242 AAH 40。我的任务是读取一个按邻接列表组织的文件,并计算从一个节点到另一个节点的最短路径。下面是Dijkstra伪代码: 我遇到的最大的麻烦是“对于与v相邻的每个顶点w”这一行,这里是我的非工作代码: 使用我的顶点类,我

  • 我的问题是 > 如何定义顶点的?在我下面的当前代码中,我只考虑了邻接列表部分的传出边 如果图中存在带的循环模式,Dijkstra的算术运算是否失败?例如,ABD形成以下循环: 我已经实现了Dijsktra的算法,但我没有在这里粘贴该代码。在澄清了这些疑问之后,我将就Dijkstra的实现问题发布一个单独的问题。 我当前的顶点、边缘和图形代码如下。正如您所注意到的,我已经为上面的图像定义了顶点和邻接

  • 作为一项练习,我必须建立一个卫星导航系统,规划从一个位置到另一个位置的最短和最快路线。它必须尽可能快,而不需要使用太多内存。 我很难决定使用哪种结构来表示图形。我知道矩阵更适合密集图,列表更适合稀疏图。我更倾向于使用列表,因为我认为添加顶点将是这个程序中最累人的部分。 我只是想听听你们的意见。如果我把一个典型的路线图看作一个图形,其中不同的位置是节点,道路是边缘。你认为它是稀疏的还是密集的?在这种

  • 在斯坦福的一门算法课程中,教授为图的邻接表表示列出了以下成分: 顶点数组或列表 边的数组或列表 顶点列表中的每个顶点都指向其上的边。 边列表中的每个边都指向其边点。 这种表示法与图形的“关联表”表示法相同吗?如果是,为什么本文认为“邻接表”和“发生率表”是分开的?

  • 大家好:)今天我正在提高我在图论和数据结构方面的技能。我决定用C++做一个小项目,因为我已经有一段时间没有用C++了。 我想为一个有向图做一个邻接表。换句话说,看起来像: 这将是一个有向图,其中V0(顶点0)对V1和V3有一条边,V1对V2有一条边,V2对V4有一条边,如下所示: