首页
学习
活动
专区
工具
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<net.vexnum; i++)...除此之外,求带负权值边单源最短路径还可以贝尔曼-福特算法。至于迪杰斯特拉比弗洛伊德快,也是因为他是单源缘故。

1.8K30

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

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

92440
  • 教你一招 | 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

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

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

    1.4K10

    单源最短路径问题(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) 时间。

    54010

    力扣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 算法进行解决。 有兴趣的话可以访问我博客或者关注我公众号、头条号,说不定会有意外惊喜。

    52020

    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任何顶点最短路径长度

    70920

    最短路径算法

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

    2.7K20

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

    注意:有路径必须沿弧方向构成顶点序列;构成路径顶点可能重复出现(即允许反复绕圈)。 路径长度:路径边或弧数目。...最短路径:如果从有图中某一顶点(称为源点)到达另一顶点(称为终点)路径可能不止一,如何找到一路径使得沿此路径上各边上权值总和达到最小。...最终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.7K40

    算法之bfs、dfs、prim、Dijkstra

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

    2.9K61

    最短路径算法

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

    3.1K10

    八十七、探究最短路问题: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)距离。

    77110

    Floyd是咋求最短路径?

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

    53410

    应用——最短路径

    问题抽象:在带权有图中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...算法求有网Gv0顶点到其余顶点最短路径 n = G.vexnum; // G 顶点个数 for(v = 0; v < n; v++){ // n 个顶点依次初始化 S[v] =

    47096

    全源最短路径问题采用Floyd算法进行求解_floyd算法求最短路径是贪心吗

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

    81420
    领券