作者 龚雄兴

单位 湖北文理学院

本题目要求通过读入无向网的边的信息(省略了各顶点的信息,仅用顶点编号来表示),构造图,并利用Dijkstra算法,求出指定源点到其它各点的最短路径。

样例">输入样例:

第一行,两个整数,顶点数vN和边数eN。
以后若干行,是相关边的信息,无向图的边是对称的,只输入一半的边(小编号到大编号的,间以空格),最后两行各一个整数,前一个指定源点,后一个指定的查询的终到点。
(注意,示例中34条边,只输入了17条边的信息)

10 34
0 1 2
0 3 5
1 2 5
1 3 2
2 4 8
2 5 4
3 5 4
3 6 2
4 7 5
4 5 2
5 6 3
5 7 9
5 8 7
6 8 7
7 8 3
7 9 4
8 9 8
0
8

输出样例:

在一行中输出从源点到指定终点的短路径及代价,注意:所有符号均为西文符号。

0-->1-->3-->6-->8:13

个人思路:

朴素dijkstra+打印路径

dijkstra算法思路:

dijkstra求的是单源最短路问题

int g[i][j]  : 从点i 到 点j 的距离

int dist[N] :  从起点到每一个点的最短距离

bool  st[N] : 当前是否确定了最短路

1.初始化距离

将起点初始化为0 ,其他所有点都等于正无穷(一个比较大的数)

2.for循环N次

每次找到未确定最短路且距离最近的点 t 。

接下来 st [ t ] = true;

然后用 点t 更新其他点的距离。

看一下 从点t 出发到达的每个点到起点的距离,能不能用起点到点t再到这个点的距离更新。

即假设 点t 能到达 点x ,判断dist[x] 是否小于dist[t] + g[t][x],小于即更新dist[x]。

最后我们得到的dist数组即为每个点到起点的最短距离

3.打印路径

考虑dijkstra算法特点,每次我们选出一个当前的最短距离点t ,用它去更新其余点,如果有点被更新,那么这个点当前的最短路径中,点t 一定是这个点的前一个点,根据这个特点,我们可以用一个path数组,保存这个点的前一个节点,当所有点的最短路径都确定以后,我们的path数组保存的刚好是每个点的最短路的前一个节点,因为dijkstra是单源最短路,path保存每个点最短路径的前一个点,而前一个点的最短路径必定包含在后一个的最短路径里面。因此他们可以连起来。此时,我们利用一个循环,便可将最短路径倒序输出。

#include <bits/stdc++.h>
using namespace std;const int N = 100;
const int INF = 100000;
int n, m;int g[N][N];   //利用邻接矩阵保存两个点的距离
int dist[N];   //保存每个点到起点的最短距离
bool st[N];    //每个点是否已经确定最短距离
int path[N];   //每个点最短路径的前一个节点
int dijkstra(int sec,int n)
{memset(dist, 0x3f, sizeof dist); //初始化所有距离为最大dist[sec] = 0;                   //初始化起点距离为0for (int i = 0; i < n - 1; i++)  //循环找到起点最短的且未确定最短距离的点t{int t = -1;     for (int j = 0; j <= n; j++)if (!st[j] && (t == -1 || dist[t] > dist[j])) {t = j;}for (int j = 0; j <= n; j++) {if (dist[j] > dist[t] + g[t][j]) {path[j] = t; //若从起点到点j的距离被从起点到点t,再从点t到点j更新,//那么t就是j的前驱节点,保存到path[j]里}dist[j] = min(dist[j] , dist[t] + g[t][j]);//更新最短路}st[t] = true;   //点t的最短路径已经确定}if (dist[n] == 0x3f3f3f3f) return -1;return dist[n];
}int main() {memset(g, 0x3f, sizeof g);     //初始化邻接矩阵距离无穷大memset(path, -1, sizeof path); //初始化每个点的前驱为-1,表示没有前驱cin >> n >> m;m /= 2;while (m--) {int a, b, c;scanf("%d%d%d", &a, &b, &c);//由于是无向图,需要加入两个边,a到b,和b到ag[a][b] = min(g[a][b], c);g[b][a] = min(g[b][a], c);}int s, e;  // s为起点,e为终点scanf("%d", &s);scanf("%d", &e);if(s==e){cout<<s<<"-->"<<e<<":0";return 0;}int ret = dijkstra(s, n-1); //传入起点,和点的个数,由于点从0开始,所以应该传入n-1stack<int> stk;  //根据path特点,我们用一个栈保存,最后弹栈输出时,即为正序int k = e;while (true) {if (k == s) break;stk.push(path[k]);k = path[k];}while (!stk.empty()) {cout << stk.top() << "-->";stk.pop();}cout << e;printf(":%d", dist[e]);
}

7-4 最短路径之Dijkstra(朴素dijkstra打印路径)相关推荐

  1. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

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

  2. AcWing 1137. Choose the best route(朴素dijkstra反向建图 or 虚拟源点法)

    题目比较简单,讲两种做法 法一.二都是用的朴素dijkstra算法 法一:反向建图 求终点s到每个起点的最短距离 O(T * (n^2 + n))(T表示多组测试数据)820ms #include & ...

  3. 基于dijsktra算法的最短路径求解_基于dijkstra算法的AGV路径规划(含C++代码)

    文字&代码来源: @Wasabi喵喵喵 基于dijkstra算法的AGV路径规划 dijkstra算法的路径规划 经典Dijkstra算法是一种贪心算法,根据路径长度递增次序找到最短路径,通常 ...

  4. java 有向图 最短路径算法_java使用Dijkstra算法实现单源最短路径

    单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径.在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质. 一.最短路径的最优子结构性质 该性质描述为:如果P(i,j) ...

  5. POJ - 1847(朴素dijkstra)

    题目链接 思路: 由题意得只有第一个方向不要转距离为 0,其他方向要转距离都为 1, 已知起点和中点,朴素dijkstra即可,感觉最短路的问题很多有建图思路大概就会写了. 样例为答案为 0 的情况解 ...

  6. 图的应用—求解最短路径(BFS、Dijkstra和Floyd算法)

    BFS算法虽然可以求解最短路径问题,但是需要注意的是该算法只能求解非带权图的单源最短路径问题,或者说带权值相同且为1的图单源最短路径问题. 1.图的邻接矩阵存储结构定义 #define MaxVerN ...

  7. 迪杰斯特拉算法及变式(最短距离,打印路径,最短经过节点数)

    问题描述 给定一个图,图的节点名称用(000 ~ N−1N - 1N−1)表示.NNN为图的节点个数,MMM为边的个数,SSS为起始点. 输入条件: 第一行输入 NMSN M SNMS. 其后MMM行 ...

  8. Frog Traveler 最短路,bfs剪枝,打印路径

    题意 : 给两个长度为n的数组,初始位于索引n,目标是越过索引1,注意不能往后跳,每次可以跳0到a[i]a[i]a[i]米,即,身处索引iii,可以跳[0,a[i]][0, a[i]][0,a[i]] ...

  9. hdu-1104-Remainder(BFS打印路径+数论)(%与mod的区别)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1104 题意:(注意题目中的%是指mod)开始给了你n, k, m....每次由+m, -m, *m, ...

最新文章

  1. 如果想成为一名顶尖的前端,这份书单你一定要收藏!
  2. 文本行中的基线(baseline)、底线、顶线、中线、行高、行距、行内框
  3. python丢失api-ms-win-crt-process_api-ms-win-crt-process-l1-1-0.dll 丢失的处理,遇到问题和完美解决...
  4. 【已解决】cannot resolve file db.properties‘
  5. 爬虫用mysql存储还是mongodb_【面试题】Mongodb和MySQL存储爬虫数据的特点是什么?...
  6. 安装用户debian7安装oracle11g
  7. Win11任务栏如何设置在顶部
  8. spark任务shell运行_Spark原理与实战(七)部署模式与运行机制
  9. MATLAB关于Mesh的相关命令
  10. 解决Linux系统在设置alias命令重启后失效的问题
  11. 改善代码设计 —— 处理概括关系(Dealing with Generalization)
  12. 网卡重启影响nfs吗_NFS性能优化 不完整介绍
  13. ★★★★★手把手教你如何利用凤凰实现破 解后台权限以及升级固件(刷机)★★★★★...
  14. 张俊芳电机学13章计算题以及答案
  15. html css 美化模板,通用css样式,全局css样式,css样式模板,
  16. TPshop项目(三)
  17. ipfs pubsub代码解读
  18. 我的世界神奇宝贝服务器注册指令,《我的世界》神奇宝贝MOD召唤指令大全
  19. python怎么编写流氓软件_自己用python写个删除软件可好?
  20. LintCode入门题目

热门文章

  1. The following tasks did not complete: first,Did you forget to signal async completion?问题
  2. 大学生信息安全(学习笔记一)
  3. 程序员的呓语---萎缩的情商
  4. UITableView性能优化
  5. EBS 常用模块到XLA的关联字段追溯
  6. 在Apple开发官网测试TestFlight
  7. Lidar 激光雷达与自动驾驶
  8. 通过改变电脑的某些设置来呵护我们的眼睛
  9. 动态表单 mysql_【mysql】动态表单应该如何设计数据库?
  10. Cesium基础-表面面积量算(依地形量算、依模型表面量算)