题目描述

在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题。

在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次序产生最短路径的算法。

可将迪杰斯特拉算法描述如下:

在本题中,读入一个有向图的带权邻接矩阵(即数组表示),建立有向图并按照以上描述中的算法求出源点至每一个其它顶点的最短路径长度。

输入

输入的第一行包含2个正整数n和s,表示图中共有n个顶点,且源点为s。其中n不超过50,s小于n。

以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。

输出

只有一行,共有n-1个整数,表示源点至其它每一个顶点的最短路径长度。如果不存在从源点至相应顶点的路径,输出-1。

请注意行尾输出换行。

样例输入

4 1
0 3 0 1
0 0 4 0
2 0 0 0
0 0 1 0

样例输出

6 4 7

提示

在本题中,需要按照题目描述中的算法完成迪杰斯特拉算法,并在计算最短路径的过程中将每个顶点是否可达记录下来,直到求出每个可达顶点的最短路径之后,算法才能够结束。

迪杰斯特拉算法的特点是按照路径长度递增的顺序,依次添加下一条长度最短的边,从而不断构造出相应顶点的最短路径。

另外需要注意的是,在本题中为了更方便的表示顶点间的不可达状态,可以使用一个十分大的值作为标记。

AC:

#include <iostream>
using namespace std;const int maxn = 50;
const int inf = 1000000000;
int n, s;  //n个顶点,源点为s  n<= 50, s < n;
int G[maxn][maxn];
int d[maxn];
bool final[maxn];
bool p[maxn][maxn];
vector<int> dd;void ShortestPath_DIJ(int v0)
{int j, v, w, min;for(v = 0; v < n; v++){final[v] = false;d[v] = G[v0][v];for(w = 0; w < n; w++){p[v][w] = false;}if(d[v] < inf){p[v][v0] = true;p[v][v] = true;}}d[v0] = 0;final[v0] = true;for(int i = 1; i < n; i++){min = inf;for(int w = 0; w < n; w++){if(final[w] == false && d[w] < min){v = w;min = d[w];}}final[v] = true;for(w = 0; w < n; w++){if(final[w] == false && min + G[v][w] < d[w]){d[w] = min + G[v][w];for(j = 0; j < n; j++){p[w][j] = p[v][j];}p[w][w] = true;}}}}int main()
{scanf("%d%d", &n, &s);for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){scanf("%d", &G[i][j]);if(G[i][j] == 0 && i != j)//不可达{G[i][j] = inf;}}}ShortestPath_DIJ(s);for(int i = 0; i < n; i++){if(d[i] == 0 ){continue;}else if(d[i] == inf){printf("-1 ");}else{printf("%d ", d[i]);}}printf("\n");return 0;
}

刚开始提交,答案错误50%,没注意输出格式,后面正确了~

Codeup墓地-问题 A: 算法7-15:迪杰斯特拉最短路径算法相关推荐

  1. 1768 Problem A 算法7-15:迪杰斯特拉最短路径算法

    问题 A: 算法7-15:迪杰斯特拉最短路径算法 时间限制: 1 Sec  内存限制: 32 MB 提交: 118  解决: 56 题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点 ...

  2. 问题 A: 算法7-15:迪杰斯特拉最短路径算法

    题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题. 在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次 ...

  3. 迪杰斯特拉-最短路径算法

            迪杰斯特拉(Dijkstra)算法是基于动态规划实现的,他的主要功能是求出各节点到顶点的最短路径.         上图展示: 这是各节点连接图,其中A为顶点,求各节点到顶点的最短路径 ...

  4. 题目 1708: 数据结构-Dijskra(迪杰斯特拉)最短路径算法

    参考<大话数据结构> 题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题. 在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用 ...

  5. python3dijkstra_python3 实现Dijkstra(迪杰斯特拉)最短路径算法

    Dijkstra 单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中 ...

  6. 算法7:迪杰斯特拉算法

    目录 1. 应用场景-最短路径问题 2. 迪杰斯特拉(Dijkstra)算法介绍 3. 迪杰斯特拉(Dijkstra)算法过程 4. 算法分析过程 5. 代码实现 1. 应用场景-最短路径问题 看一个 ...

  7. Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

    1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...

  8. 最短路径 - 迪杰斯特拉(Dijkstra)算法

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

  9. 【图】最短路径--迪杰斯特拉(Dijkdtra)算法

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 算法思想 每次找到离源 ...

最新文章

  1. ios 项目的.gitignore
  2. 大学计算机基础B这本书哪有,大学计算机基础b试卷
  3. 【学习笔记】第二章——进程同步、进程互斥、进程互斥的硬件/软件实现方法
  4. while/for 嵌套expect 批量免密码传文件
  5. 【UML】——为什么要使用UML
  6. 小米笔记本bios版本大全_聊一款被“差别对待”的笔记本电脑
  7. C语言阿拉伯数字转大写汉字,阿拉伯数字转大写汉字
  8. 浅谈android应用之编程语言
  9. 洛谷P4518 [JSOI2018]绝地反击(计算几何+二分图+退流)
  10. jquery提交表单验证示例代码
  11. OpenCV鼠标修改图片透明度
  12. 中央电视台最常用的 100 首经典背景乐曲(视频制作音乐推荐) 2009-05-12 17:31:47
  13. 解决office2007打开很慢问题
  14. 使用vue做一个“淘宝“项目——2
  15. 最本质的相机内参intrinsics与外参extrinsics分析,从建模,推导到求解
  16. dva如何去掉hash
  17. 计算机毕业设计,Java+MySQL 高校校园招聘系统
  18. 如何将高版本的CAD文件转成低版本的CAD文件
  19. Docker启动tomcat容器部署java web应用详细过程
  20. 注册VMware Fusion提示错误/验证码无法输入问题

热门文章

  1. OkHttp3 HTTP请求执行流程分析
  2. 加入知识星球(永久免费)
  3. AOM Summit:拥抱开源,引领新技术创新
  4. 一不小心,我们办了场全球最 _____ 的技术大会......
  5. 风起云涌时,亦是光芒四射时 | LiveVideoStackCon 2020线上峰会日程全公开
  6. Hulu兰华峰:专注平衡用户体验和成本
  7. Bitmovin:视频开发者报告2018
  8. Java多线程之volatile详解
  9. NeurIPS 2019|腾讯AI Lab详解入选论文,含模仿学习、强化学习、自动机器学习等主题...
  10. 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)