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

时间限制: 1 Sec  内存限制: 32 MB
提交: 118  解决: 56

题目描述

在带权有向图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

提示

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

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

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

经验总结

经典的迪杰斯特拉算法,我这里在查找未访问的距离最短的结点时使用的是优先队列,emmmm应该可以加快一些运行速度吧= =

正确代码

#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=60;
const int INF=0x3fffffff;
int G[maxn][maxn],n,d[maxn];
bool vis[maxn]={false};
struct Node
{int v,dis;bool operator <(const Node &a)const{return dis>a.dis;}Node(int x,int y){v=x;dis=y;}
};
void Dijkstra(int s)
{fill(d,d+maxn,INF);d[s]=0;priority_queue<Node> q;q.push(Node(s,d[s]));for(int i=0;i<n;++i){if(q.empty()==true)return ;while(vis[q.top().v]==true){q.pop();if(q.empty()==true)return;}int u=q.top().v;q.pop();vis[u]=true;for(int v=0;v<n;++v){if(G[u][v]!=0&&vis[v]==false&&d[u]+G[u][v]<d[v]){d[v]=d[u]+G[u][v];q.push(Node(v,d[v]));}}}
}
int main()
{int s;while(~scanf("%d",&n)){scanf("%d",&s);for(int i=0;i<n;++i)for(int j=0;j<n;++j)scanf("%d",&G[i][j]);Dijkstra(s);for(int i=0;i<n;++i){if(i!=s){if(d[i]==INF)printf("-1 ");elseprintf("%d ",d[i]);}}printf("\n");}return 0;
}

1768 Problem A 算法7-15:迪杰斯特拉最短路径算法相关推荐

  1. Codeup墓地-问题 A: 算法7-15:迪杰斯特拉最短路径算法

    题目描述 在带权有向图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. spring2.5 mvc使用注解upload上传文件
  2. 余承东回应鸿蒙OS十大疑云:人都是被逼出来的
  3. 网络营销——网络营销专员面对网站优化难题有经验!
  4. 蓝桥杯 - 翻硬币(贪心)
  5. element-ui如何进行调试
  6. java 修饰_Java 修饰符
  7. 【水】对于算法的个人理解
  8. 正则的文字替换和字符串的替换哪个快_JavaScript正则表达式怎么用?
  9. tasklist 结束进程_Windows: windows下的终止进程的命令(tasklist/tskill)
  10. Flutter之实战InheritedWidget详解
  11. 服务器主动向客户端发送信息机制
  12. 阿里P6工作四年,女友跑路、晋升无望、年薪45W买不起房,加班加到焦虑!
  13. 如何做AI开源项目?零基础到100star
  14. 增设区域分销商:APC渠道变革拒绝“扁平化”
  15. 阅读 | 《娱乐至死》笔记 | Part1
  16. c#生成PPT总结(Microsoft.Office.Interop)
  17. PyTorch中tensor介绍
  18. 浅谈仪器控制【1.Python与Labview/Labwindows】
  19. 一种基于柔性压力传感器的机械手驱动系统
  20. GIS Geography

热门文章

  1. matlab输入一个3位整数,matlab随机产生一个3位整数,将它的十位数变为0。例如,输入738则输出708。...
  2. 一万块的iPhone X来了,你看好苹果的黑科技吗?
  3. Mediator模式(仲裁者设计模式)
  4. 青春日志html,人民日报青春日记:做有信仰的奋斗者
  5. 发现fir.im的bug,可以获取fir.im用户的任何软件id和用户token。
  6. wordpress模板_如何在15分钟内定制WordPress模板
  7. 时钟显示(C语言实现)
  8. 发现贝叶斯的乐高积木
  9. iOS TouchID/FaceID 开发
  10. Nginx正则表达式locationrewrite