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实现
基本原理: 迪杰斯特拉算法是一种贪心算法. 首先建立一个集合,初始化只有一个顶点.每次将当前集合的所有顶点(初始只有一个顶点)看成一个整体,找到集合外与集合距离最近的顶点,将其加入集合并检查是否修改路 ...
随机推荐
- 用Netty开发中间件:高并发性能优化(转)
用Netty开发中间件:高并发性能优化 最近在写一个后台中间件的原型,主要是做消息的分发和透传.因为要用Java实现,所以网络通信框架的第一选择当然就是Netty了,使用的是Netty 4版本.Net ...
- #!/bin/sh与#!/bin/bash的区别
Linux 中的 shell 有很多类型,其中最常用的几种是: Bourne shell (sh).C shell (csh) 和 Korn shell (ksh), 各有优缺点.Bourne she ...
- python3制作捧腹网段子页爬虫
0x01 春节闲着没事(是有多闲),就写了个简单的程序,来爬点笑话看,顺带记录下写程序的过程.第一次接触爬虫是看了这么一个帖子,一个逗逼,爬取煎蛋网上妹子的照片,简直不要太方便.于是乎就自己照猫画虎, ...
- 人脸验证算法Joint Bayesian详解及实现(Matlab)
python http://blog.csdn.net/cyh_24/article/details/49059475 github https://github.com/johnnyconstant ...
- 011杰信-创建购销合同Excel报表系列-4-建立合同货物(修改,删除):合同货物表是购销合同表的子表
前面的一篇文章做的是修改删除,这篇文章做的是合同货物的修改和删除. 业务功能如下:
- 正向工程、逆向工程与MDA
正向工程.逆向工程与MDA 正向工程:从UML图形生成代码: 逆向工程:从代码和成UML图形: //不要依赖于正向或逆向工程,仅是一种辅助手段.画图的目的不是为了生成代码:而写代码的目的也不是为了生成 ...
- java----内部类与匿名内部类的各种注意事项与知识点
Java 内部类分四种:成员内部类.局部内部类.静态内部类和匿名内部类.1.成员内部类: 即作为外部类的一个成员存在,与外部类的属性.方法并列.注意:成员内部类中不能定义静态变量,但可以访问外部类的所 ...
- VC中的学习点滴
1. __stdcall 和 __cdecl __cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,由调用者负责 ...
- u盘作为git仓库,完成不同地方的代码同步
参考网上一篇 "把Git Repository建到U盘上去" 1.我经常有这样的需求,工作.家里需要对同一份代码或文档编辑,并希望在不同地方能同步: 如果是私密性不那么强,可以直接 ...
- expected_conditions判断页面元素
expected_condtions提供了16种判断页面元素的方法: 1.title_is:判断当前页面的title是否完全等于预期字符串,返回布尔值 2.title_contains:判断当前页面的 ...