首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用Java实现Dijkstra中k条最短路径的无向图

Dijkstra算法是一种用于求解单源最短路径问题的经典算法,它可以找到从起点到其他所有节点的最短路径。在无向图中,Dijkstra算法可以用于求解k条最短路径,即从起点到其他节点的k条最短路径。

在Java中,可以使用图的邻接矩阵或邻接表来表示无向图,并通过实现Dijkstra算法来求解k条最短路径。以下是用Java实现Dijkstra算法求解k条最短路径的无向图的示例代码:

代码语言:java
复制
import java.util.*;

public class Dijkstra {
    private static final int INF = Integer.MAX_VALUE; // 无穷大

    public static void main(String[] args) {
        int[][] graph = {
            {0, 2, 5, 1, INF},
            {2, 0, 3, 2, INF},
            {5, 3, 0, 3, 1},
            {1, 2, 3, 0, 1},
            {INF, INF, 1, 1, 0}
        };
        int start = 0; // 起点
        int k = 3; // k条最短路径

        List<List<Integer>> shortestPaths = findKShortestPaths(graph, start, k);
        for (int i = 0; i < shortestPaths.size(); i++) {
            System.out.println("Path " + (i + 1) + ": " + shortestPaths.get(i));
        }
    }

    public static List<List<Integer>> findKShortestPaths(int[][] graph, int start, int k) {
        int n = graph.length; // 节点数
        List<List<Integer>> shortestPaths = new ArrayList<>();

        // 初始化距离数组和路径数组
        int[] dist = new int[n];
        int[][] paths = new int[n][n];
        for (int i = 0; i < n; i++) {
            dist[i] = INF;
            Arrays.fill(paths[i], -1);
        }

        // Dijkstra算法
        PriorityQueue<Node> pq = new PriorityQueue<>(Comparator.comparingInt(node -> node.dist));
        pq.offer(new Node(start, 0));
        dist[start] = 0;

        while (!pq.isEmpty()) {
            Node curr = pq.poll();
            int u = curr.vertex;
            int d = curr.dist;

            if (d > dist[u]) {
                continue;
            }

            for (int v = 0; v < n; v++) {
                if (graph[u][v] != INF) {
                    int newDist = d + graph[u][v];

                    if (newDist < dist[v]) {
                        dist[v] = newDist;
                        paths[v] = Arrays.copyOf(paths[u], n);
                        paths[v][v] = u;

                        pq.offer(new Node(v, newDist));
                    } else if (newDist == dist[v] && paths[v][v] == -1) {
                        paths[v] = Arrays.copyOf(paths[u], n);
                        paths[v][v] = u;

                        pq.offer(new Node(v, newDist));
                    }
                }
            }
        }

        // 构造k条最短路径
        for (int i = 0; i < n; i++) {
            if (i != start && paths[i][i] != -1) {
                List<Integer> path = new ArrayList<>();
                int curr = i;

                while (curr != start) {
                    path.add(0, curr);
                    curr = paths[curr][curr];
                }

                path.add(0, start);
                shortestPaths.add(path);

                if (shortestPaths.size() == k) {
                    break;
                }
            }
        }

        return shortestPaths;
    }

    static class Node {
        int vertex;
        int dist;

        public Node(int vertex, int dist) {
            this.vertex = vertex;
            this.dist = dist;
        }
    }
}

这段代码实现了Dijkstra算法来求解k条最短路径的无向图。其中,graph是无向图的邻接矩阵表示,start是起点,k是要求解的最短路径条数。函数findKShortestPaths返回一个包含k条最短路径的列表。

该算法使用了优先队列来优化查找最短路径的过程,通过不断更新距离数组和路径数组来求解最短路径。最后,根据路径数组构造k条最短路径。

请注意,这段代码只是一个示例,实际应用中可能需要根据具体情况进行适当的修改和优化。

推荐的腾讯云相关产品:腾讯云云服务器(ECS)、腾讯云云数据库MySQL、腾讯云对象存储(COS)等。你可以通过访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于这些产品的详细信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

最短路径之Dijkstra(迪杰斯特拉)算法(无向图)

大家好,又见面了,我是你们的朋友全栈君。 简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。...原理 在已知图的邻接矩阵net.vexs[i][j](无向网,含权值的图)的条件下,通过遍历已知图的所有路径,用dis[i]数组来记录到i点的最短路径,然后在循环中不断判断更替。...①寻找遍历到点联通路径(与之相连线的点)中权值最小的一条; 标记遍历点; ②修正最短路径.../*寻找遍历到点联通路径(与之相连线的点)中权值最小的一条; 标记遍历点;*/ for(i=0; i的单源最短路径还可以用贝尔曼-福特算法。至于迪杰斯特拉比弗洛伊德快,也是因为他是单源的缘故。

2.3K30

Python 图_系列之基于实现无向图最短路径搜索

链接表的存储相比较邻接矩阵,使用起来更方便,对于空间的使用是刚好够用原则,不会产生太多空间浪费。操作起来,也是简单。 本文将以链接表方式存储图结构,在此基础上实现无向图最短路径搜索。 1....最短路径算法 从图结构可知,从一个顶点到达另一个顶点,可不止一条可行路径,在众多路径我们总是试图选择一条最短路径,当然,需求不同,衡量一个路径是不是最短路径的标准也会不同。...在有向加权图中,会以附加在每条边上的权重的数据含义来衡量。权重可以是时间、速度、量程数…… 2.1 无向图最短路径算法 查找无向图中任意两个顶点间的最短路径长度,可以直接使用广度搜索算法。...如下图求解 A0 ~ F5 的最短路径。 Tips: 无向图中任意 2 个顶点间的最短路径长度由边数决定。...,查找起始点到目标点的最短路径,使用广度优先搜索算法便可实现,但如果是有向加权图,可能不会称心如愿。

93240
  • 教你一招 | Python实现无向图最短路径

    一心想学习算法,很少去真正静下心来去研究,前几天趁着周末去了解了最短路径的资料,用python写了一个最短路径算法。算法是基于带权无向图去寻找两个点之间的最短路径,数据存储用邻接矩阵记录。...首先画出一幅无向图如下,标出各个节点之间的权值。 ?...其中对应索引: A ——> 0 B ——> 1 C ——> 2 D ——>3 E ——> 4 F ——> 5 G ——> 6 邻接矩阵表示无向图: ?...算法思想是通过Dijkstra算法结合自身想法实现的。...这时最短路径存在于表A中,得到终点的权值和来源路径,向上递推到起始点,即可得到最短路径,下面是代码: # -*-coding:utf-8 -*- class DijkstraExtendPath():

    3.7K50

    加权有向图----无环情况下的最短路径算法

    上一篇:Dijkstra算法 如果加权有向图不含有向环,则下面要实现的算法比Dijkstra算法更快更简单。...它有以下特点: 能够在线性时间内解决单点最短路径问题 能够处理负权重的边 能够解决相关的问题,例如找出最长的路径 该方法将顶点的放松与拓扑排序结合起来,首先将distTo[s]初始化为0,其他distTo...按照拓扑排序放松顶点,就能在和V+E成正比的时间内解决无环加权有向图的单点最短路径问题。...算法 } 改实现中不需要marked[]数组,因为按照拓扑排序处理不可能再次遇到已经被放松过的顶点。...下一篇:Bellman-Ford算法(可以处理含有负权边的图,但不能含有负权环)

    1.5K00

    C++ 不知图系列之基于链接表的无向图最短路径搜索

    链接表相比较邻接矩阵存储方案,使用起来更方便,对于空间的使用是刚好够用原则,不会产生太多空间浪费。理解起来,也较简单。 本文将以链接表方式存储图结构,在此基础上实现无向图最短路径搜索。 1....最短路径算法 从图结构可知,从一个顶点到达另一个顶点,不止一条可行路径,在众多路径我们总是试图选择一条最短路径。当然,需求不同,衡量一个路径是不是最短路径的标准也会不同。...在无权无向图中找到最短路径相对简单。 在有向加权图中,会以附加在每条边上的权重的数据含义来衡量。...权重可以是时间、速度、量程数…… 2.1 无权无向图最短路径算法 查找无向图中任意两个顶点间的最短路径长度,可以直接使用广度搜索算法。如下图求解 A0 ~ F5 的最短路径。...总结 本文讲解了如何使用链表存储图数据结构,以及使用广度搜索算法实现无向无权重图中顶点之间的路径搜索。

    1.3K20

    单源最短路径问题(Java)

    Dijkstra 算法每次从v-s中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist 进行必要的修改。...一旦S包含了所有V中顶点,dist数组就记录了从源到所有其他顶点之间的最短路径长度。 Dijkstra 算法可描述如下。...如dist[i]表示当前从源到顶点t的最短特殊路径长度。 3、代码实现 例如,对下图中的有向图,应用Dijkstra算法计算从源顶点1到其它顶点间最短路径的过程列在下页的表中。...而S(k,s)不是从k到s的最短距离,那么必定存在另一条从k到s的最短路径S'(k,s),那么S'(i,j)=S(i,k)+S'(k,s)+S(s,j)<S(i,j)。...4.3 计算复杂性 对于具有n个顶点和e条边的带权有向图, 如果用带权邻接矩阵表示这个图,那么Dijkstra算法的主循环体需要O(n) 时间。

    54810

    我写了一个模板,把 Dijkstra 算法变成了默写题

    比如上图这幅图用邻接表和邻接矩阵的存储方式如下: 前文 图论第二期:拓扑排序 告诉你,我们用邻接表的场景更多,结合上图,一幅图可以用如下 Java 代码表示: // graph[s] 存储节点 s 指向的节点...在用 Dijkstra 之前,别忘了要满足一些条件,加权有向图,没有负权重边,OK,可以用 Dijkstra 算法计算最短路径。...首先关于有向图和无向图,前文 图算法基础 说过,无向图本质上可以认为是「双向图」,从而转化成有向图。...因为 Dijkstra 计算最短路径的正确性依赖一个前提:路径中每增加一条边,路径的总权重就会增加。...这个前提的数学证明大家有兴趣可以自己搜索一下,我这里只说结论,其实你把这个结论反过来也是 OK 的: 如果你想计算最长路径,路径中每增加一条边,路径的总权重就会减少,要是能够满足这个条件,也可以用 Dijkstra

    1.5K10

    力扣1514——概率最大的路径

    本题主要和图的遍历求解最短路径相关,可以用 Dijkstra 或者 Bellman-Ford 算法进行解决。...原题 给你一个由 n 个节点(下标从 0 开始)组成的无向加权图,该图由一个描述边的列表组成,其中 edges[i] = [a, b] 表示连接节点 a 和 b 的一条无向边,且该边遍历成功的概率为 succProb...算法思想 设 G=(V,E) 是一个带权有向图,把图中顶点集合 V 分成两组: 第一组为已求出最短路径的顶点集合(用 S 表示,初始时 S 中只有一个源点,以后每求得一条最短路径 , 就将加入到集合 S...第二组为其余未确定最短路径的顶点集合(用 U 表示),按最短路径长度的递增次序依次把第二组的顶点加入 S 中。...本题主要和图的遍历求解最短路径相关,可以用 Dijkstra 或者 Bellman-Ford 算法进行解决。 有兴趣的话可以访问我的博客或者关注我的公众号、头条号,说不定会有意外的惊喜。

    52520

    SDN应用路由算法实现工具之Networkx

    networkx支持创建简单无向图、有向图和多重图(multigraph);内置许多标准的图论算法,节点可为任意数据,如图像文件;支持任意的边值维度,功能丰富,简单易用。...在networkx中对于二者的实现将在如下介绍。 Dijkstra 无论有向图还是无向图均可以使用Dijkstra算法,G为networkx生成的图数据结构。source为起点,target为终点。...这样的算法可以通过修改Dijkstra算法完成,逻辑不困难,但效率并不高,具体实现不加赘述,读者可查看笔者在网上找到的一个介绍文章:基于SDN的最短路径算法(迪杰斯特拉)dijkstra。...在研究的过程中,发现许多论文提到的方法都是基于拓扑信息算法K条最短路径,然后在根据带宽计算最优路径。...对临时数据结构B中的路径进行排序,找到最优路径,添加到A数据结构中, 存为A[k], 外循环一轮结束。 外循环继续,直至找到K条最优路径。

    3.1K90

    数据结构基础温故-5.图(下):最短路径

    图的最重要的应用之一就是在交通运输和通信网络中寻找最短路径。例如在交通网络中经常会遇到这样的问题:两地之间是否有公路可通;在有多条公路可通的情况下,哪一条路径是最短的等等。...带权图分为无向带权图和有向带权图,但如果从A地到B地有一条公路,A地和B地的海拔高度不同,由于上坡和下坡的车速不同,那么边和边上表示行驶时间的权值也不同。...考虑到交通网络中的这种有向性,本篇也只讨论有向带权图的最短路径。一般习惯将路径的开始顶点成为源点,路径的最后一个顶点成为终点。 ?...一、单源点最短路径   单源点最短路径是指给定一个出发点(源点)和一个有向图,求出源点到其他各顶点之间的最短路径。...Dijkstra算法的基本思想是:将图中顶点的集合分为两组S和U,并按最短路径长度的递增次序依次将集合U中的顶点加入到S中,在加入的过程中,总保持从原点v到S中各顶点的最短路径长度不大于从原点v到U中任何顶点的最短路径长度

    71220

    图的最短路径算法

    图的最短路径算法 最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径的问题。...在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。 确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。...) 常用算法 Dijkstra最短路算法(单源最短路) 图片例子和史料来自:http://blog.51cto.com/ahalei/1387799 算法介绍: 迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题...N:节点数量 通过上面的代码我们可以看出,我们实现的Dijkstra最短路算法的时间复杂度是O(N^2)。...Dijkstra思想总结: dijkstra算法本质上算是贪心的思想,每次在剩余节点中找到离起点最近的节点放到队列中,并用来更新剩下的节点的距离,再将它标记上表示已经找到到它的最短路径,以后不用更新它了

    2.7K20

    图算法之bfs、dfs、prim、Dijkstra

    基于搜索的算法还包括计算最小生成树的Prim算法以及计算最短路径的Dijkstra算法。图实现算法在现实的算法结构中占据重要的部分。...相反,边没有方向的图称为无向图。   有向图: ?   无向图: ?...使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树(一个节点到其他所有节点的最短路径)。该算法常用于路由算法或者作为其他图算法的一个子模块。...原理: 设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组: 第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合...第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。

    2.9K61

    数据结构与算法——图最短路径

    注意:有向图的路径必须沿弧的方向构成顶点序列;构成路径的顶点可能重复出现(即允许反复绕圈)。 路径长度:路径中边或弧的数目。...图的最短路径:如果从有向图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。...最终dist数组中的值就是源点到所有顶点的最短路径。 4.3 实例图解 例如:图4.3.1所示的有向图,以顶点1为源点,运用Dijkstra算法,获得最短路径。...最终得到的dist数组如下: 4.4 算法分析 复杂度:迪杰斯特拉(Dijkstra)算法适用于权值为非负的图的单源最短路径,使用最小堆时间复杂度是O(VLogV),用斐波那契堆的复杂度O(E+VlgV...否则数组dist[n]中记录的就是源点s到各顶点的最短路径长度。 5.3 实例图解 以图5.3.1所示的有向图为例,以顶点1为源点,采用Bellman-Ford算法计算最短路径。

    4.8K40

    八十七、探究最短路问题:Dijkstra算法

    最短路问题 最短路问题(Shortest Path Problems):给定一个网络,网络的边上有权重,找一条从给定起点到给定终点的路径使路径上的边权重总和最小。...最短路问题常用Dijkstra算法解决 Dijkstra算法 Dijkstra算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。...我们还是以上面的图为例 先用邻接矩阵表示无向图: MAX = 9999 g= [ [0, 1, 4, 6], [MAX, 0, MAX, 2], [MAX, MAX, 0,...「把Dijkstra 算法应用于无权图,或者所有边的权都相等的图,Dijkstra 算法等同于BFS搜索。」 多点求解 在很多的时候,要求输入一组点,然后求出输入一个起始点,得到无向图最短路径。...之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。

    79710

    图的最短路径算法

    图的最短路径算法 最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径的问题。...在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。 确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。...) 常用算法 Dijkstra最短路算法(单源最短路) 图片例子和史料来自:http://blog.51cto.com/ahalei/1387799 算法介绍: 迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题...Dijkstra思想总结: dijkstra算法本质上算是贪心的思想,每次在剩余节点中找到离起点最近的节点放到队列中,并用来更新剩下的节点的距离,再将它标记上表示已经找到到它的最短路径,以后不用更新它了...用邻接表代替邻接矩阵存储 参考:http://blog.51cto.com/ahalei/1391988 总结如下: 可以发现使用邻接表来存储图的时间空间复杂度是O(M),遍历每一条边的时间复杂度是也是

    3.1K10

    Floyd是咋求图的最短路径?

    前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径。...i到k的最短路径dp[k][j]的意思为k到j的最短路径....程序实现 而对于程序而言,这个插入的过程相当简单。核心代码只有四行! 这个写法适合有向图和无向图,无向图的算法优化后面会说。...Dijkstra用的图是一致的,大家可以自行比对,结果一致,说明咱么的结果成功的。...有的,这个是个无向图,也就是加入点的时候枚举其实会有一个重复的操作过程(例如枚举AC和CA是效果一致的),所以我们在Floyd算法的实现过程中过滤掉重复的操作,具体代码为: class Solution

    54710

    最短路径四大算法「建议收藏」

    时间复杂度O(KE); floyd可以用于有负权的图中,即使有负环,算法也可以检测出来,可以求任意点的最短路径,有向图和无向图的最小环和最大环。...时间复杂度O(n3); 任何题目中都要注意的有四点事项:图是有向图还是无向图、是否有负权边,是否有重边,顶点到自身的可达性。...无向图的最小环做法和有向图不一样,是因为无向边可能会被用两次导致出错,举例说就是:枚举了一条边i->j,然后其与dp[n][j][i]的和作为一个结果,但是如果j到i的最短路就是边j->i的话,那么我们找的环其实只是一条边而已...(从源点到其他所有点v); 2、有向图&无向图; 3、边权可正可负 4、差分约束系统 图G(v,e),源点s,数组Distant[i]记录了从源点s到顶点i的路径长度,循环执行至多n-1...2、图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图称为顶点vi作为弧尾的出边表。

    64530

    图的应用——最短路径

    问题抽象:在带权有向图中A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径。...最短路径与最小生成树不同,路径上不一定包含n个顶点 两种常见最短路径问题 --- Dijkstra(迪杰斯特拉)算法 —— 单源最短路径 [在这里插入图片描述] 算法思想 把图中顶点集合分成两组: 第一组为已求出其最短路径的顶点集合...S 第二组为尚未确定最短路径的顶点集合U 初始时,S只包含源点,S={v},U包含除v外的其他顶点; 从U中选取一个距离最小的顶点k,把k加入到S中; 以k作为新考虑的中间点,修改U中各顶点的距离; 重复步骤...2、3 直到所有顶点都包含在S中 算法实现 算法流程图 [在这里插入图片描述] C++代码实现 void ShortestPath_DIJ(AMGraph G, int v0){ // 用Dijkstra...算法求有向网G的v0顶点到其余顶点的最短路径 n = G.vexnum; // G 中顶点个数 for(v = 0; v < n; v++){ // n 个顶点依次初始化 S[v] =

    48596
    领券