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

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

汲雅珺
2023-03-14

我的问题是

>

  • 如何定义顶点的邻接列表?在我下面的当前代码中,我只考虑了邻接列表部分的传出边

    如果图中存在带的循环模式,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)};
    
        }
    }
    
  • 共有1个答案

    双恩
    2023-03-14

    >

  • 仅使用传出边有效。

    不会。好的算法实现不会有循环问题。在算法中,不可能有圈的问题,因为节点越来越多地被“消除”,并且许多边被消除。

    对算法将解决这个问题。在开始之前,您必须确保所有中间信息都设置正确,例如,您需要能够识别是否删除了节点。在算法中,您需要选择要开始的节点,如果该节点没有相邻节点,则其他节点(例如A)的previous属性将设置为null。将更容易实现F。邻接=新边[0]

  •  类似资料:
    • 我有一个无向加权图,作为邻接列表实现。有一个hashmap,其中节点对象作为键,边对象列表作为值。这些边对象包含两个节点之间边的权重。 我试图编写一个Dijkstra的最短路径算法;但是我担心我的图结构太复杂,无法理解我能为Dijkstra找到的所有示例/伪代码。有人能提供任何帮助吗?提前感谢。

    • 对于许多点,我有2D的协定子,例如点a=x,y 我想做一个图的实现使用邻接列表列表和连接某些点的无方向图在最有效的方式(不使用地图或哈希表)

    • 我已经看到了dijkstra的加权图的算法,我应该怎么做才能在未加权图中找到最短路径? 我应该考虑所有边之间的权重0或1? 其次,我想在节点上实现一个bfs来检查一个节点是否可以从任何其他节点到达?有没有可能,因为定义一个2-D数组的给出了一个内存故障。

    • 本文向大家介绍java实现Dijkstra最短路径算法,包括了java实现Dijkstra最短路径算法的使用技巧和注意事项,需要的朋友参考一下 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。 Dijkstra一般的表述

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

    • 本文向大家介绍java实现最短路径算法之Dijkstra算法,包括了java实现最短路径算法之Dijkstra算法的使用技巧和注意事项,需要的朋友参考一下 前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法。该算法被称为是“贪心算法”的成功典范。本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码。 一、知识准备: 1、表示图的数据结构 用于存储图的