Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Dijkstra的所有对最短路径

Dijkstra的所有对最短路径
EN

Stack Overflow用户
提问于 2013-01-05 22:33:58
回答 2查看 3.5K关注 0票数 0

我搜索了Dijkstra的所有对最短路径的Java实现。我为一个源最短路径找到了一个算法。我实际上不懂Java,但我正在学习离散数学,所以也许有人可以帮助我。我必须更改什么才能使其成为全对最短路径?

-编辑-再次感谢templatetypedef。我试过了。现在我认为代码中有另一个小错误。

输入文件(try.txt):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 0 2 68
 3 4 97
 0 3 8

这是我得到的错误输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    From 3:
Shortest Path Cost to 3 is: 0.0
Shortest Path Cost to 2 is: Infinity
Shortest Path Cost to 0 is: Infinity
Shortest Path Cost to 4 is: 97.0

From 2:
Shortest Path Cost to 3 is: Infinity
Shortest Path Cost to 2 is: 0.0
Shortest Path Cost to 0 is: Infinity
Shortest Path Cost to 4 is: 97.0

From 0:
Shortest Path Cost to 3 is: 8.0
Shortest Path Cost to 2 is: 68.0
Shortest Path Cost to 0 is: 0.0
Shortest Path Cost to 4 is: 97.0

From 4:
Shortest Path Cost to 3 is: 8.0
Shortest Path Cost to 2 is: 68.0
Shortest Path Cost to 0 is: Infinity
Shortest Path Cost to 4 is: 0.0

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;

class Vertex implements Comparable<Vertex> {
    public final String name;
    public List<Edge1> adjacencies;
    public double minDistance = Double.POSITIVE_INFINITY;
    public Vertex previous;

    public Vertex(String argName) {
        name = argName;
        adjacencies = new ArrayList<Edge1>();
    }

    public void addEdge(Edge1 e) {
        adjacencies.add(e);
    }

    public String toString() {
        return name;
    }

    public int compareTo(Vertex other) {
        return Double.compare(minDistance, other.minDistance);
    }

}

class Edge1{
    public final Vertex target;
    public final double weight;

    public Edge1(Vertex argTarget, double argWeight) {
        target = argTarget;
        weight = argWeight;
    }
}


public class Dijkstra {

    public static void computePaths(Vertex source) {
        source.minDistance = 0.;
        PriorityQueue<Vertex> vertexQueue = new PriorityQueue<Vertex>();
        vertexQueue.add(source);

        while (!vertexQueue.isEmpty()) {
            Vertex u = vertexQueue.poll();

            // Visit each Edge exiting u

            for (Edge1 e : u.adjacencies) {
                Vertex v = e.target;
                double weight = e.weight;
                double distanceThroughU = u.minDistance + weight;
                if (distanceThroughU < v.minDistance) {
                    vertexQueue.remove(v);
                    v.minDistance = distanceThroughU;
                    v.previous = u;
                    vertexQueue.add(v);
                }

            }
        }
    }

    public static List<Vertex> getShortestPathTo(Vertex target) {
        List<Vertex> path = new ArrayList<Vertex>();
        for (Vertex vertex = target; vertex != null; vertex = vertex.previous)
            path.add(vertex);

        Collections.reverse(path);
        return path;
    }

    public static void main(String args[]) {

        Map<String, Vertex> vertexMap = new HashMap<String, Vertex>();
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader("try.txt"));
            String line;
            boolean inVertex = true;

            while ((line = in.readLine()) != null) {


                    //store the edges
                    String[] parts = line.split(" ");
                    String vFrom = parts[0];
                    String vTo = parts[1];
                    if(!vertexMap.containsKey(vFrom))
                    {
                        Vertex v= new Vertex(vFrom);
                        vertexMap.put(vFrom, v);
                    }
                    if(!vertexMap.containsKey(vTo))
                    {
                        Vertex v1= new Vertex(vTo);
                        vertexMap.put(vTo, v1);
                    }


                    double weight = Double.parseDouble(parts[2]);
                    Vertex v = vertexMap.get(vFrom);
                    if (v != null) {
                        v.addEdge(new Edge1(vertexMap.get(vTo), weight));

                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        finally{
            if(in!= null)
                try {
                    in.close();
                } catch (IOException ignore) {
                }
        }

        //get a list of all the vertices
        Collection<Vertex> vertices = vertexMap.values();

        //Vertex source = vertices.iterator().next();
        for(Vertex source:vertices){
        System.out.println("From " + source+":");
        computePaths(source);
        for (Vertex v : vertices) {
            System.out.println("Shortest Path Cost to " + v + " is: " + v.minDistance);
           // List<Vertex> path = getShortestPathTo(v);
          //  System.out.println("Path: " + path);
        }System.out.println();
        source.minDistance=Double.POSITIVE_INFINITY;
        source.previous=null;}
    }
}
EN

回答 2

Stack Overflow用户

发布于 2013-01-05 22:36:16

要使用Dijkstra算法计算所有对的最短路径,只需多次重新运行Dijkstra算法,每个可能的起始节点一次。您应该能够轻松地调整上面的算法,通过为每个可能的源调用computePaths(source)并记住在每个点找到的最短路径来使此逻辑工作。

希望这能有所帮助!

票数 4
EN

Stack Overflow用户

发布于 2013-01-05 23:55:10

仅供参考,多次运行Djikstra来解决这个问题将是O(n^4)Floyd-Warhsall可以在O(n^3)中解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14177124

复制
相关文章
最短路径:dijkstra算法
#include <iostream> using namespace std; #define N 510 #define INF 0x3f3f3f3 int g[N][N]; int dist[N]; bool st[N]; int n, m; //返回值为1到n的路径长度 int dijkstra() { memset(dist, INF, sizeof dist); dist[1] = 0;//初始路径长度为0 自己到自己 for(int i=0; i<n; ++i) {
lexingsen
2022/02/24
4.2K0
最短路径dijkstra,floyd
给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径 [1] 问题。
废江_小江
2022/09/05
6380
最短路径-Dijkstra算法
Dijkstra算法,又称"迪杰斯特拉算法",是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
仙士可
2019/12/18
2.8K0
[图]最短路径-Dijkstra算法
2.BFS可能会是Dijkstra算法的实质,BFS使用的是队列进行操作,而Dijkstra采用的是优先队列。
王荣胜
2020/03/13
7K0
[图]最短路径-Dijkstra算法
Dijkstra的最短路径算法
给定图中的图形和源顶点,找到给定图形中从源到所有顶点的最短路径。 Dijkstra的算法与最小生成树的Prim算法非常相似。与Prim的MST一样,我们以给定的源为根生成SPT(最短路径树)。我们维护两组,一组包含最短路径树中包含的顶点,另一组包括最短路径树中尚未包括的顶点。在算法的每个步骤中,我们找到一个顶点,该顶点位于另一个集合中(尚未包括的集合)并且与源具有最小距离。
全栈程序员站长
2022/08/28
1.2K0
Dijkstra的最短路径算法
最短路径问题:Dijkstra算法
所谓最短路径问题是指:如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小。
233333
2020/02/11
5.7K1
最短路径问题:Dijkstra算法
[模板] Dijkstra单源最短路径
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139191.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/02
2560
最短路径之Dijkstra算法
这里,我们想要得出节点a(节点1)到节点b(节点5)的最短路径,就是怎么走可以使得权重值的和最小,每一条边都有一个权重。
用户4766018
2022/08/19
1.5K0
最短路径之Dijkstra算法
单源最短路径dijkstra算法_dijkstra是谁
酋长说:”嗯,如果你能够替我弄到大祭司的皮袄,我可以只要 8000 金币。如果你能够弄来他的水晶球,那么只要 5000 金币就行了。”
全栈程序员站长
2022/09/22
7310
图算法|Dijkstra最短路径算法
01 — 单源最短路径 首先解释什么是单源最短路径,所谓单源最短路径就是指定一个出发顶点,计算从该源点出发到其他所有顶点的最短路径。如下图所示,如果源点设为A,那么单源最短路径问题,就是求解从A到B,
double
2018/04/02
6.3K0
图算法|Dijkstra最短路径算法
最短路径问题—Dijkstra算法详解
前言 Nobody can go back and start a new beginning,but anyone can start today and make a new ending. Name:Willam Time:2017/3/8
全栈程序员站长
2022/09/05
9730
最短路径Dijkstra算法的简单实现
最近刷题一连碰到好几道关于最短路径的问题自己一开始用深搜过了之后也就没怎么 管,但是之后的好几道用深搜都超时,之后查了资料才知道这种最短路径的问题一般使用广搜的方法。
萌萌哒的瓤瓤
2020/08/26
8910
Dijkstra算法--单源最短路径
在http://blog.csdn.net/hacker_zhidian/article/details/54898064这一篇博客中总结了一下在求图的最短路中的一个算法-Floyd算法,Floyd算法用于求图的多源最短路径(多源最短路径:图的所有顶点到其他顶点的最短路径),时间复杂度和其他求最短路算法相比较高,如果一些题目只要求求单源最短路径(单源最短路径:图的某个顶点到其他顶点的最短路径)的话,Floyd算法显然不是最好的选择,那么今天我们来看一下另一个用于求单源最短路径的算法:Dijkstra算法。
指点
2019/01/18
2.6K0
Dijkstra算法--单源最短路径
Dijkstra算法求图中最短路径
在此借用上一篇文章[深度优先搜索(DFS)两点之间的可行路径](深度优先搜索(DFS)两点之间的可行路径)中的例子:
带萝卜
2020/10/23
7870
Dijkstra算法求图中最短路径
Dijkstra算法求单源最短路径
在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同。如果是一个带权图,那么路径长度为路径上各边的权值的总和。两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度。
恋喵大鲤鱼
2018/08/03
2.4K0
Dijkstra算法求单源最短路径
图论--最短路--dijkstra(含路径输出)模板
#include<iostream> #include<stack> #include<queue> #include<cstring> #include<cstdio> using namespace std; typedef long long ll; typedef pair<int,int> PII; struct Node { int var,next,val; } edge[100000005]; int head[100005],tot,dis[100005],N,M; int pre
风骨散人Chiam
2020/10/28
6810
单源最短路径算法——Dijkstra算法
7 2 1 2 3 1 2 3 3 4 10 2 5 5 0 4 4 2 2 4 2 5 8 6 4 1 6 6 0 1 5 1
RainMark
2019/09/10
1.1K0
Dijkstra-单源最短路径算法
  Dijkstra算法用来计算一个点到其他所有点的最短路径的算法,是一种单源最短路径算法。也就是说,只能计算起点只有一个的情况。
别团等shy哥发育
2023/03/15
9510
Dijkstra-单源最短路径算法
数据结构——最短路径Dijkstra算法
在上一篇博文里,我记录了最小生成树的算法实现,而在这篇里,我们来讲讲查找最短路径的算法,Dijkstra算法。
Originalee
2018/08/30
1.2K0
最短路径:Dijkstra算法(求单源最短路径)Floyd算法(求各顶点之间最短路径)[通俗易懂]
在一个带权图中,顶点V0到图中任意一个顶点Vi的一条路径所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径最短的那条路径称为最短路径。
全栈程序员站长
2022/06/25
2.2K0
最短路径:Dijkstra算法(求单源最短路径)Floyd算法(求各顶点之间最短路径)[通俗易懂]

相似问题

最短路径Dijkstra Java

11

Dijkstra算法寻找所有可能的最短路径

10

Dijkstra的最短路径-HackerRank

14

Dijkstra最短路径算法

12

Dijkstra算法的最短路径

013
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文