最开始接触最短路径是在数据结构中图的那个章节中。运用到实际中就是我在大三参加的一次美赛中,解决中国的水资源问题。所谓单源最短路径,就是一个起点到图中其他节点的最短路径,这是一个贪心算法。

迪杰斯特拉算法原理(百科):

按路径长度递增次序产生算法:
把顶点集合V分成两组:
(1)S:已求出的顶点的集合(初始时只含有源点V0)
(2)V-S=T:尚未确定的顶点集合
将T中顶点按递增的次序加入到S中,保证:
(1)从源点V0到S中其他各顶点的长度都不大于从V0到T中任何顶点的最短路径长度
(2)每个顶点对应一个距离值
S中顶点:从V0到此顶点的长度
T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度
依据:可以证明V0到T中顶点Vk的,或是从V0到Vk的直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和
(反证法可证)
求最短路径步骤
算法步骤如下:
G={V,E}
1. 初始时令 S={V0},T=V-S={其余顶点},T中顶点对应的距离值
若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值
若不存在<V0,Vi>,d(V0,Vi)为∞
2. 从T中选取一个与S中顶点有关联边且权值最小的顶点W,加入到S中
3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值
重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止
java实现:
 
数据变化:
public class Graph{public static void main(String[] args){// TODO Auto-generated method stubint [][]distance=new int[7][7];distance[0][1]=2;distance[0][3]=1;distance[1][3]=3;distance[1][4]=10;distance[2][0]=4;distance[2][5]=5;distance[3][2]=2;distance[3][4]=2;distance[3][5]=8;distance[3][6]=4;distance[4][6]=6;distance[6][5]=1;int []p=new int[distance.length];int []d=getMinDistance(0, distance,p);for(int i=1;i<d.length;i++){System.out.println("the distance from 1 to "+(i+1)+":"+d[i]);int temp=i;System.out.print(temp+1+"<-");while(p[temp]!=0){System.out.print(p[temp]+1+"<-");temp=p[temp];}System.out.println("1");}}/** 迪杰斯特拉求单元最短路径* 原理:*//*** 谈心策略,起点到w的最短距离=min{dv+c(v,w),dw},dv是已知的到节点v的最短距离* @param start  要求的节点* @param distance 邻接矩阵 表示相邻顶点的距离* @param p 前置节点,到达该节点的前面节点* @return*/public static int[] getMinDistance(int start,int [][]distance,int []p){int []know=new int[distance.length];//起点到节点的距离是否已知int []d=new int[distance.length];//起点到各个顶点的距离/***********初始化距离*******************/for(int i=0;i<d.length;i++)//初始情况下距离起点当然是无穷大d[i]=Integer.MAX_VALUE;d[start]=0;/*************************************//****初始化know表示是否已知道最短距离********/for(int i=0;i<know.length;i++)know[i]=0;/*************************************//****初始化最短节点的前置节点********/for(int i=0;i<p.length;i++)p[i]=0;/*************************************/while(true){//所有的最短距离都已知道if(isAllKnow(know))break;//找到d中最小的并且know=0的元素int pos=0,i,min=Integer.MAX_VALUE;for(i=0;i<d.length;i++){if(min>d[i]&&know[i]==0){min=d[i];pos=i;}}know[pos]=1;/*************找到前置节点是pos的所有节点,更新距离***************/for(i=0;i<distance.length;i++){if(distance[pos][i]!=0){if(d[i]>d[pos]+distance[pos][i]){d[i]=d[pos]+distance[pos][i];p[i]=pos;}}}}return d;}private static boolean isAllKnow(int []array){for(int e:array){if(e==0)return false;}return true;}}

运行截图:

数据结构之单源最短路径(迪杰斯特拉算法)-(九)相关推荐

  1. c++ 单源最短路径-狄杰斯特拉算法

    文章目录 源码 输出 狄杰斯特拉算法 适用范围:没有负权重的图, 可以有环,有向无向图均可 求解问题:单源最短路径 时间复杂度:V^2 源码 #include <iostream> #in ...

  2. >算法笔记-动态规划-最短路径迪杰斯特拉算法

    算法笔记-动态规划-最短路径迪杰斯特拉算法 作者:星河滚烫兮 前言   图的最短路径问题在现实生活中有很广阔的应用,最短路径又分为单源最短路径与多源最短路径,前者求出固定起点到其他节点的最短路径,后者 ...

  3. 最短路径——迪杰斯特拉算法——图的数据结构

    最短路径是在工程上经常用到的概念,在这里给出了从单源点到任意顶点的迪杰斯特拉算法. 先来看看基本概念: 用代码C语言实现如下: #include<string.h>#include< ...

  4. 最短路径迪杰斯特拉算法--邻接矩阵

    一.算法介绍 迪杰斯特拉算法(解决单源最短路径) 基本思想:每次找到离源点(如1号节点)最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径. 基本步骤:1,设置标记数组bo ...

  5. 别说了,世界那么大我想去看看!(最短路径-迪杰斯特拉算法弗洛伊德算法)

    前言: 一直想去外面的世界看看,中国城市那么多,那么美,怎么样才可以用最少的钱,最短的时间游遍我想去的城市呢?(我在做梦?不不不!迪杰斯特拉算法和弗洛伊德算法来了)      这两个算法有着广泛的用途 ...

  6. 校园导游系统(纯C语言实现)最短路径---迪杰斯特拉算法

    西京学院导游系统 学习数据结构+C语言可实现 #include <stdio.h> #include <stdlib.h> #include <conio.h> # ...

  7. 最短路径迪杰斯特拉算法 c语言,Dijkstra第K最短路径算法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //运筹学之最短路径 #include #include #define M 99999 int main() { int G[100][100]; in ...

  8. java 点到点最短路径,迪杰斯特拉算法处理无向图中最短路径的(dijkstra)Java实现(指定两点,求最短距离及路径) | 学步园...

    其实不是原创哈,我写不出来. 如何求图中V0到V5的最短路径呢? java实现的方式如下: 第一步,根据图来建立权值矩阵: int[][] W = { {  0,   1,   4,  -1,  -1 ...

  9. 图的最短路径--迪杰斯特拉算法 c语言

    还是按照书上的例子: 完整代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #def ...

  10. L2-001 紧急救援 (25 分)最短路径 迪杰斯特拉算法

    L2-001 紧急救援 题目 代码 题目 L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城 ...

最新文章

  1. 聊一聊跨域,Vue向Django请求数据的一些问题
  2. java 泛型反射_Java使用反射来获取泛型信息示例
  3. ASP.NET中实现大结果集分页研讨 转
  4. python标准库time_Python3标准库:time时钟时间
  5. Qt Creator导出QML
  6. 制作一个让客户满意的软件
  7. 绝地求生 android版支持蓝牙吗,《绝地求生》吃鸡必须要顶配吗?这些配置也能畅玩...
  8. C++ 虚函数表浅析
  9. Ubuntu下映射串口设备到docker
  10. Dockerfile 学习:Docker Alpine PHP 安装扩展
  11. 有限元分析简单实例之四杆结构(matlab)
  12. VC6.0下配置opengl
  13. 应用软件漏洞利用分布
  14. 台式计算机怎么安装无线网卡,台式机无线网卡怎么用 台式机USB无线网卡安装使用教程...
  15. 计算机系换届视频,计算机科学与技术系学生会换届方案
  16. 论文笔记——Thompson Sampling for Contextual Bandits with Linear Payoffs(线性收益)
  17. 法线贴图的实现【OpenGL】
  18. elementui级联选择器空children导致选择无法显示的问题
  19. LINUX NGINX 环境禁止访问指定后缀文件
  20. 神经网络应用实例 -- python

热门文章

  1. Linux 部署开源WAF模块 ModSecurity
  2. 数字图像处理学习笔记(三)
  3. 前端iframe标签介绍及使用
  4. Qt绘制星空图及卫星视图坐标
  5. 【Unity实战100例】Unity屏幕画线,Unity屏幕画图HSJ绘画工具
  6. 使用单片机的串口蓝牙通信写的接收SBUF里的数据,并进行发送执行命令,显示在数码管上,波特率9600
  7. 局域网内windows远程mac(使用TeamView)
  8. weblogic服务器日志记录说明
  9. html存储数据的方法,数据存储方式有哪些
  10. 创业之路 - 魏杰:下一个 10 年,将造就一批新富翁