关闭

Dijkstra算法详解

标签: dijkstra算法
2134人阅读 评论(0) 收藏 举报
分类:

算法简介

  • 用于计算从一个顶点到其余各顶点的最短路径算法
  • 适用于权值为非负的图的单源最短路径,用斐波那契堆的复杂度O(E+VlgV)
  • 主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止

算法思想

这里我们以这组例子为列

这里写图片描述

1 4 1
4 2 3
4 3 1
3 2 1

在这里我们使用数组vis数组来标记未走过的节点

以dis数组来存储从 1 到 到 1 2 3 4 每个点的最短路径

代码实现:

import java.util.*;
import java.io.*;
public class Dijkstra {
    private static final int  MAX = 1 << 29;//两点间没有距离 则设为最大值
    private static Scanner scanner ;
    private static int[][] map ;
    private static int[] dis ,vis;
    private static int num ,mum;
    static {
        map = new int[100][100];
        dis = new int[100];//记录最短路径
        vis = new int[100];//标记被走过的点
        scanner = new Scanner(new BufferedInputStream(System.in));
    }
    public static void main(String[] args) {
        while(scanner.hasNext()) {
            num = scanner.nextInt();
            mum = scanner.nextInt();
            /*初始化邻接矩阵 */
            for (int i = 1 ; i<=num ; i++) {
                for (int j = 1; j<= num ; j++) {
                    if (i!=j) {
                        map[i][j] = MAX;
                    }else {
                        map[i][j] = 0;
                    }
                }
            }
            /*初始化两点距离*/
            for (int i = 1; i<=mum; i++ ) {
                int x,y,z;
                x = scanner.nextInt();
                y = scanner.nextInt();
                z = scanner.nextInt();
                map[x][y] = z;
            }

            dij(1);
            System.out.println();
            for (int i = 1;  i<=num; i++) {
                System.out.printf("%d %d\n",i,dis[i]);
            }
        }
    }

    private static void dij(int s) {
        for (int i = 1; i<=num ;i++ ) {
            /*初始化起点未走过 */
            vis[i] = 0;
            /*初始化 dis数组*/
            dis[i] = map[s][i];

        }
        /*标记起点已被走过*/
        vis[s] = 1;
        dis[s] = 0;
        /* 遍历所有的顶点*/
        for (int i = 1;i<=num ; i++) {
            /*to 用于记住满足条件的点的下标*/
            int to = 1;
            int d = MAX;
            for (int j = 1; j<=num ; j++) {
                /*满足此顶点未被走过 且 此顶点没有权值(未表明距离)*/
                if (vis[j]==0 && d > dis[j]) {
                    d = dis[j];
                    to = j;
                }
            } 
            /* 标记此点被走过*/
            vis[to] = 1;
            for (int j = 1;j<=num ;j++) {
                /* 获得当前最短路径存入dis数组*/
                if (vis[j]==0 && dis[j] > dis[to]+map[to][j]) {
                    dis[j] = dis[to] + map[to][j];
                }
            }
        }
    }
}

* 现在我们来分析dij函数,首先我们初始化了dis数组与vis数组,然后标记了第一个点,进入for循环来遍历每个点,然后在第二层for循环中找到未被走过的点,然后对其进行标记,然后通过一个for循环来找到当前点与其他点的最短路径然后记录在dis数组中*

这里写图片描述

* 这里的结果就是从 1 到 1 2 3 4 的每个的最短距离了*

1
1
查看评论

数据结构--Dijkstra算法最清楚的讲解

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。 此外,引进两个集合S和U。S...
  • heroacool
  • heroacool
  • 2016-03-30 15:10
  • 12224

最短路dijkstra算法详解:dijkstra(图解)(详

本人小白,如果有写的不恰当的地方,还请大家指出,共同进步学习。 ----------------------------------------------------------------------------------------------------------------------...
  • mengxiang000000
  • mengxiang000000
  • 2015-12-28 20:23
  • 10991

详解Dijkstra算法(含数学证明和优化)

Dijkstra算法简介:Dijkstra算法是由荷兰计算机科学家Edsger Wybe Dijkstra于1959年提出的一种解决有向加权图中单源最短路问题的算法,其中要求加权图中不可有负权边。 Dijkstra算法步骤演示 算法数学证明 Dijkstra算法优化
  • CrazyKeyboardMan
  • CrazyKeyboardMan
  • 2017-10-12 21:18
  • 508

Dijkstra算法的实现及原理

算法用处与基本思想Dijkstra算法的作用是求指定点到图中任何一点的最短路径。 其基本思路与BFS(深度优先搜索)有些类似,但不同的是BFS用的是一般队列,也就是严格的先进先出。而Dijkstra算法用到的则是优先队列。什么是优先队列优先队列中是有序的队列,其顺序取决于规定的规则。比如可以规定值...
  • SCaryon
  • SCaryon
  • 2017-06-28 21:46
  • 1503

Dijkstra 算法的 C/C++ 实现

Dijkstra算法 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,是广度优先算法的一种,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存...
  • chengonghao
  • chengonghao
  • 2016-08-28 18:47
  • 1451

Dijkstra算法最短路径演示动画(数据结构)

  • a9529lty
  • a9529lty
  • 2009-04-03 13:44
  • 5889

迪克斯特拉算法-- Dijkstra's Algorithm

在图形应用中,常常需要求从图中某个结点至其余各结点的最短路径,如对于一个物流配送系统计算从配送中心到各订货点的最短路径。 Dijkstra's Algorithm 基本思想: 若给定带权有向图G=(V,E)和源顶点v0,构筑一个源集合S,将v0加入其中。 ① 对差集V\S中 个顶点vi...
  • leaf_130
  • leaf_130
  • 2016-02-15 16:37
  • 4766

通俗算法讲解之图最短路径——Dijkstra算法

Dijkstra算法计算单源有向正权值图最短路径计算
  • qq_26849233
  • qq_26849233
  • 2016-10-27 19:05
  • 810

最短路径问题---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/81、最短路径问题介绍问题解释: 从图中的某个...
  • qq_35644234
  • qq_35644234
  • 2017-03-08 16:42
  • 26651

Dijkstra算法java现实

迪杰斯特拉算法java现实
  • wangchsh2008
  • wangchsh2008
  • 2015-05-31 15:05
  • 1835
    个人资料
    • 访问:112489次
    • 积分:1389
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:3篇
    • 译文:0篇
    • 评论:32条
    博客专栏
    最新评论