Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负。

解题思路:

  V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路径的权值(程序中用dist[i]表示)已经确定。算法反复选择具有最短路径估计的顶点u 属于 V-S(即未确定最短路径的点,程序中finish[i]=false的点),并将u加入到S中(用finish[i]=true表示),最后对u的所有输出边进行松弛。

程序实现:

     输入数据:

    

5 7

0 1 100

0 2 30

0 4 10

2 1 60

2 3 60

3 1 10

4 3 50

/*************************************************************************> File Name: Dijkstra.cpp> Author: He Xingjie> Mail: gxmshxj@163.com> Created Time: 2014年06月07日 星期六 22时12分43秒> Description: ************************************************************************/
#include<iostream>
#include<cstdio>using namespace std;#define INF 99999//map矩阵记录路径图,dist[i]表示源点到节点
//i的最短路径,finish[i]表示节点i找到最短路径
//path[i]=j表示从源节点到i节点的最短路径要经过j
int map[100][100], dist[100], finish[100];
int path[100];void Dijkstra(int s, int n)
{
/**s为源点,n为节点的个数*当finish[i]=true时,dist[i]*为s到i的最短路径*假设S为已求得最短路径的终点集合*V为所有节点的集合*/int i, j, v, k;//初始化dist[i]for (i=1; i<n; i++){dist[i] = map[s][i];if (dist[i] < INF)path[i] = s;}//初始化源节点finish[s] = true;dist[s] = 0;for (i=1; i<n; i++)  //总共有n-1个节点
    {int min = INF;for (j=0; j<n; j++)      {//从V-S中(没有找到最短路径的集合)寻找离源节点//距离最近的点if (!finish[j] && dist[j] < min){v = j;min = dist[j];}}//找到最短路径finish[v] = true;    //把节点v加入到S中//松弛(Relax)for (k=0; k<n; k++){if (!finish[k] && map[v][k] != INF)if (dist[k] > dist[v] + map[v][k]){dist[k] = dist[v] + map[v][k];path[k] = v;}}}
}void PrintPath(int k)
{if (k == 0){printf("%d", k);return;}PrintPath(path[k]);printf("->%d", k);
}void PrintMap(int n)
{int i, j;//输出矩阵for (i=0; i<n; i++){for (j=0; j<n; j++){if (map[i][j] == INF)printf("INF ");elseprintf("%d  ", map[i][j]);}printf("\n");}
}int main()
{int n, m, i, j;freopen("input.txt", "r", stdin);cin>>n>>m;    //n是顶点数,m是边数//初始化for (i=0; i<n; i++){finish[i] = false;for (j=0; j<n; j++)map[i][j] = INF;}//输入for(int i=1; i<=m; i++){int i,j;cin>>i>>j;cin>>map[i][j];}/**PrintMap(n);*/Dijkstra(0, n);for (i=1; i<n; i++){printf("Path: ");PrintPath(i);printf("  Dist:%d\n", dist[i]);}return 0;
}

参考:

http://www.cnblogs.com/dolphin0520/archive/2011/08/26/2155202.html

http://blog.csdn.net/hnuzengchao/article/details/7534690

转载于:https://www.cnblogs.com/Jason-Damon/p/3775936.html

单源最短路径算法---Dijkstra相关推荐

  1. 单源最短路径算法—Dijkstra算法(详细介绍)

    一.算法简介 ​       迪杰斯特拉算法(Dijkstra),由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年提出.又叫狄克斯特拉算法.这是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中 ...

  2. C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)

    上一篇主要讲了二叉树的先序,中序,后序遍历算法以及深度和节点的算法,这篇就讲一讲图的基本算法. 一.图的基本概念 1.1有向图G1: 有向图G是由两个集合V(G)和E(G)组成的,其中:V(G)是顶点 ...

  3. 图的单源最短路径:Dijkstra算法实现

    本文介绍的是图的非负权值的单源最短路径问题.问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法 ...

  4. C++实现dijkstra单源最短路径算法-邻接表+优先队列

    dijkstra单源最短路径算法不允许边权值为负,适用的图范围可以很大. 代码如下: #include <iostream> #include <queue> #include ...

  5. dijkstra算法PHP,单源最短路径(dijkstra算法)php实现

    做一个医学项目,其中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路如下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi ...

  6. 图论-单源最短路径算法(拓扑,Dijkstra,Floyd,SPFA)

    前言 单源最短路径是学习图论算法的入门级台阶,但刚开始看的时候就蒙了,什么有环没环,有负权没负权,下面就来总结一下求单源最短路径的所有算法以及其适用的情况. 单源最短路径 设定图中一个点为源点,求其他 ...

  7. 图的最短路径之Dijkstra求单源最短路径算法(C++)

    一个有向带权图求它的单源最短路径可以使用Dijkstra算法. 单源最短路径是指:从图中的某个顶点出发,到其余各个顶点权值最小的路径. Dijkstra算法需要用到三个辅助数组: dist[max]: ...

  8. Dijkstra单源最短路径算法

    这里写目录标题 一.算法原理 二.MATLAB实现 三.参考文献 一.算法原理 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶 ...

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

    Dijkstra 单源最短路径算法 Java实现 算法导入 算法核心 复杂度分析 时间复杂度 空间复杂度 代码实现 参考资料 结尾 算法导入 在图论中,求最短路径有一个经典的算法 Dijkstra算法 ...

最新文章

  1. classpath详解
  2. C语言二级指针与典型应用(1)
  3. js调用vlc_如何使用HTML5或JavaScript查看RTSP流,而不使用Real Player插件上的VLC插件等插件?...
  4. LeetCode 858. 镜面反射(最小公倍数/最大公约数)
  5. 征稿 | ​2020年全国知识图谱与语义计算大会
  6. web 服务器 内存 影响_工业环境软件套件 CODESYS web 服务器被曝严重的RCE漏洞
  7. 苹果2020年全系展望:iPhone12不会去掉刘海但5G是必须的
  8. Kubernetes详解(五)——Kubernetes核心对象
  9. python汉化补丁包怎么安装_如何安装python包
  10. npm使用及cmd常用命令
  11. 苹果CMS采集参数全自动采集教程
  12. python打开记事本并输入内容_打开记事本输入文字
  13. 黑白照片转换成彩色照片(无需任何编程)
  14. NO.ONE进程、进程、线程、线程——阿古兽高级超级终极究极进化暴龙兽喷火暴龙兽机械暴龙兽战斗暴龙兽
  15. java查找文件路径_如何查找java路径?
  16. latex出现File ended while scanning use of \frame.错误
  17. Open3d Point cloud outlier removal 点云异常值移除
  18. 软件中级设计师 - 面向对象开发
  19. 最新研究:朝九晚五可能会让你的身心受到巨大伤害!
  20. 软件版本(release、stable、lastest)的区别

热门文章

  1. 计算机科学与技术文理兼收吗,哪些专业是文理兼收的专业?
  2. 怎么撤销定时说说_武夷山币7省线下预约火爆!名字错了怎么办,附预约问题整理...
  3. Linux系统C/C++通用错误码实现模板
  4. 关于svn、git生成版本号脚本的再次改进
  5. Docker安装运行mysql
  6. 阻止电脑自动安装软件_坡解版wetool 安装条件-购买-老友网
  7. 95-872-060-源码-CEP-匹配事件提取
  8. 【Elasticsearch】elasticsearch shard 分片
  9. 【clickhouse】mac 10.15.7使用docker安装clickhouse
  10. 【jmx】java jmx 获取 kafka topic的logStart LogEnd信息