dijstra算法,求源点到各个顶点的最短距离
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算法,求源点到各个顶点的最短距离的更多相关文章
- Dijstra算法求最短路径
参考博客:http://blog.51cto.com/ahalei/1387799 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. ...
- Bellman_Ford算法(求一个点到任意一点的最短距离)
单源最短路问题是固定一个起点,求它到任意一点最短路的问题. 记从起点出发到顶点 i 的最短距离为d[i],则有以下等式成立 d[i]=min{d[j]+(从j到 i 的边的权值) 看代码 #inclu ...
- Dijkstra算法(求一点到任意一点的最短距离)
思路:先找出最短的一个点,也就是起点,从起点出发,找最短的边,同时标记起点为true(代表已经访问过),访问过的点就不用再访问了,依次下去,保证每一次找到的边都是最短的边 到最后没有边可以更新了就代表 ...
- _DataStructure_C_Impl:Floyd算法求有向网N的各顶点v和w之间的最短路径
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4] ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
- Dijstra算法-------为了纪念,等以后看的时候方便
杭电problem2066 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total ...
- sw算法求最小割学习
http:// blog.sina.com.cn/s/blog_700906660100v7vb.html 转载:http://www.cnblogs.com/ylfdrib/archive/201 ...
- Dijkstra算法求最短路径 Java实现
基本原理: 迪杰斯特拉算法是一种贪心算法. 首先建立一个集合,初始化只有一个顶点.每次将当前集合的所有顶点(初始只有一个顶点)看成一个整体,找到集合外与集合距离最近的顶点,将其加入集合并检查是否修改路 ...
随机推荐
- Oracle拉出在sqlserver建表的语句
我们将Oracle数据同步到sqlserver时,是先得在sqlserver端建表的. 复杂的字段我们不同步,就仅仅考虑以下四种数据类型. Oracle到SQLServer做的映射: int -> ...
- 你真的需要一个jQuery插件吗
jQuery的插件提供了一个很好的方法,节省了时间和简化了开发,避免程序员从头开始编写每个组件.但是,插件也将一个不稳定因素引入代码中.一个好的插件节省了无数的开发时间,一个质量不好的插件会导致修复错 ...
- Hadoop源码分析之读文件时NameNode和DataNode的处理过程
转自: http://blog.csdn.net/workformywork/article/details/21783861 从NameNode节点获取数据块所在节点等信息 客户端在和数据节点建立流 ...
- 【MySql】脚本备份数据库
#!/bin/bash #this is a script of mysql backup #Mysql="mysql" #MysqlDump="mysqldump&qu ...
- oracle和SQLserver数据库中select into 的区别
在Oracle中是这样的 在SQLserver中是这样的
- hdu 4722(记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4722 思路:简单的记忆化搜索,留意一下A==0时的情况就可以了. #include<iostre ...
- C#中Uri类的解释
URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源.而URL是uniform resource locator,统一资源定位器,它是一种具体的UR ...
- MySQL5.6绿色版安装(mysql-5.6.24-winx64.zip)
1.数据库安装 Mysql官方网站:http://www.mysql.com/,数据库下载地址:http://www.mysql.com/downloads/.从官方网站可以找到两种文件包,一种是ex ...
- System.in中的read()方法
大家先来看例如以下这个程序 public class TestInputStream { public static void main(String args[]) throws IOExcepti ...
- Linux命令之乐--md5sum
md5sum命令用于生成和校验文件的md5值.它会逐位对文件的内容进行校验,它常用于检查文件的完整性. 读取文件的MD5值 [root@new ~]# md5sum /usr/local/sbin/* ...