1:dijstra算法常用语求最短距离,

dijstra每次从未发现节点n[]中,发现距离源点最短的节点m,求出最短节点后,将m添加到已发现节点y[]中,用该节点m进行更新其它未发现节点n[]-m的最短距离。直到发现所有节点

证明:m为什么是距离源点s的最短距离,

因为在未发现节点中该节点距离最短,所以不会有从s到n[]-m再到m的距离和小于s到m。

在已发现节点y[]中,从s到y[]再到m的距离和,如果有小于s到m的距离,那么在求得s>y[i]的最短距离时,就已经用(s>y[i])+(y[i]>m)替换掉s>m的距离了。所以不会存在这种情况

代码:

package com.li.chapter24.mydijstra;

import java.io.InputStream;
import java.util.Scanner; /**
* @program: GradleTestUseSubModule
* @author: Yafei Li
* @create: 2018-06-28 19:45
* 自己编写迪杰斯特拉算法 ,解决图论及其应用 1.4节 a到b的最短路问题
**/
public class MyDijStraAlgorithm { public static void main(String[] args){
MyDijStraAlgorithm dijStraAlgorithm=new MyDijStraAlgorithm();
int[] minDisArr = dijStraAlgorithm.dijstra(0);
for (int i = 0; i < minDisArr.length; i++) {
System.out.println(minDisArr[i]);
}
}
//vertx输入的源点
public int[] dijstra(int vertx) { int[][] arrWeight=getArrOfGraph();
int[] arrVertx = arrWeight[vertx]; //其它节点与vertx的距离 boolean[] isFound = new boolean[arrVertx.length];
isFound[vertx]=true; for (int i = 0; i < arrVertx.length; i++) { //遍历所有的点
int mindis=Integer.MAX_VALUE;
int v=vertx;
for (int j = 0; j < arrVertx.length; j++) {
if (!isFound[j]) {
if (mindis > arrVertx[j]) {
mindis = arrVertx[j];
v=j;
}
}
} isFound[v]=true; for (int j = 0; j < arrVertx.length; j++) {
if (!isFound[j]) {
if (mindis + arrWeight[v][j] < arrVertx[j]) { //vertx到v的距离加上v到j的距离
arrVertx[j]=mindis + arrWeight[v][j];
}
}
}
}
return arrVertx; } public int[][] getArrOfGraph() {
Class clazz = this.getClass();
InputStream ins = clazz.getResourceAsStream("/data2.txt");
Scanner scanner = new Scanner(ins);
int[][] intarr = new int[8][8];
int row=0;
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] strarr = line.split(" ");
for (int i = 0; i < strarr.length; i++) {
intarr[row][i] = Integer.parseInt(strarr[i]);
}
row++;
}
return intarr;
}
}

下面为数据,放到resource下

下面的数据表示,行号,列号代表节点 ,节点为0-7

其中8表示为 第0个节点到第4个节点的距离为8

999代表两个节点之间没有相邻,说明它们的距离无穷大

0 2 999 999   1 999
2 0 1 999 6 999 999 999
999 1 0 9 4 3 999 999
999 999 9 0 999 6 999 2
8 6 4 999 0 2 7 2
999 999 3 6 2 0 999 4
1 999 999 999 7 999 0 9
999 999 999 2 2 4 9 0

dijstra算法,求源点到各个顶点的最短距离的更多相关文章

  1. Dijstra算法求最短路径

    参考博客:http://blog.51cto.com/ahalei/1387799        与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下.   ...

  2. Bellman_Ford算法(求一个点到任意一点的最短距离)

    单源最短路问题是固定一个起点,求它到任意一点最短路的问题. 记从起点出发到顶点 i 的最短距离为d[i],则有以下等式成立 d[i]=min{d[j]+(从j到 i 的边的权值) 看代码 #inclu ...

  3. Dijkstra算法(求一点到任意一点的最短距离)

    思路:先找出最短的一个点,也就是起点,从起点出发,找最短的边,同时标记起点为true(代表已经访问过),访问过的点就不用再访问了,依次下去,保证每一次找到的边都是最短的边 到最后没有边可以更新了就代表 ...

  4. _DataStructure_C_Impl:Floyd算法求有向网N的各顶点v和w之间的最短路径

    #include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4] ...

  5. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  6. 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径

    自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...

  7. Dijstra算法-------为了纪念,等以后看的时候方便

    杭电problem2066 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

  8. sw算法求最小割学习

    http://  blog.sina.com.cn/s/blog_700906660100v7vb.html 转载:http://www.cnblogs.com/ylfdrib/archive/201 ...

  9. Dijkstra算法求最短路径 Java实现

    基本原理: 迪杰斯特拉算法是一种贪心算法. 首先建立一个集合,初始化只有一个顶点.每次将当前集合的所有顶点(初始只有一个顶点)看成一个整体,找到集合外与集合距离最近的顶点,将其加入集合并检查是否修改路 ...

随机推荐

  1. Linux开机启动文件rc.local无法执行怎么办?

    rc.local是Linux系统中的一个重要的开机启动文件,每次开机都要执行这个文件.但是有一些用户的Linux系统无法执行这个文件,并导致了一系列的问题.遇到这个问题我们应该怎么办呢? 在Linux ...

  2. Spring Boot 属性配置&自定义属性配置

    在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring boot中的模块化配置,在pom.xml中依赖的每个Starter都有默认配置,而这些默认配 ...

  3. sql 更新字段

    UPDATE YpeopleSET power='0'WHERE power='1'; UPDATE Ypeople SET power='1' WHERE power='0' and pid='22 ...

  4. UML概述

    UML (Unified Modeling Language)统一建模语言,是描述.构造和文档化系统制品的可视化语言,是一种图形表示法. UML用途:UML是一种工具,主要用在我们对软件用面向对象的方 ...

  5. 去掉if

    修改前 namespace CleanCSharp.Methods.Dirty {     class BooleanSwitchingArgumentsExample     {         p ...

  6. MathType中有几种不同的省略号

    省略号是一个使用很广泛的符号,这个符号在很多方面都有应用,它一般表示列举的意思.文科方面的省略号跟数理中的省略号使用时有一些区别,前者是6个点,而后者只要3个点.当在用MathType数学公式编辑器时 ...

  7. python3----datetime模块分析

    datetime模块用于是date和time模块的合集,datetime有两个常量,MAXYEAR和MINYEAR,分别是9999和1. datetime模块定义了5个类,分别是 1.datetime ...

  8. SQL Server计算列

    计算列由可以使用同一表中的其他列的表达式计算得来.表达式可以是非计算列的列名.常量.函数,也可以是用一个或多个运算符连接的上述元素的任意组合.表达式不能为子查询. 例如,在 AdventureWork ...

  9. Egret在Chrome浏览器中的内存占用(内存泄露)

    参考: 怎样查看Chrome的内存占用情况 JS内存泄漏排查方法(Chrome Profiles) chrome内存泄露(一).内存泄漏分析工具 chrome内存泄露(二).内存泄漏实例 目录: 一 ...

  10. python裁剪base64编码的图片

    简介 今天遇到需要裁剪base64字符串的PNG图片,并返回base64格式字符串的任务,捣鼓半天. 裁剪代码如下: def deal_inspect_img(base64_str): "& ...