题目描述

有n个城市m条道路(n<1000, m<10000),每条道路有个长度,请找到从起点s到终点t的最短距离和经过的城市名。

输入

输入包含多组测试数据。

每组第一行输入四个数,分别为n,m,s,t。

接下来m行,每行三个数,分别为两个城市名和距离。

输出

每组输出占两行。

第一行输出起点到终点的最短距离。

第二行输出最短路径上经过的城市名,如果有多条最短路径,输出字典序最小的那条。若不存在从起点到终点的路径,则输出“can't arrive”。

样例输入

3 3 1 3
1 3 3
1 2 1
2 3 1

样例输出

2
1 2 3
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<stack>
#include<map>
#include<unordered_map>
#include<set>
#include<functional>
#include<string>
using namespace std;
typedef long long ll;
#define maxn 1008
struct Node {int v;int dis;
};
int n, m;
vector<Node> Adj[maxn];//邻接表
int pre[maxn];//记录到达结点v的最短路径中,v的前驱u
int d[maxn];//记录单源最短距离
int num[maxn];//记录SPFA结点入队次数
bool inq[maxn];//判断结点是否在SPFA算法的队列中
const int INF = 0x3fffffff;//在SPFA算法中,队列中的结点是:刚刚被优化最短距离的结点,
//而优化了一个结点u的最短距离,与这个结点相连的其他结点v的最短距离就可能可以被继续优化
//所以我们遍历其他结点v,找到可以优化的结点,然后继续放进队列inQueue
bool SPFA(int s) {memset(inq, false, sizeof(inq));memset(num, 0, sizeof(num));fill(d, d + maxn, INF);for (int i = 0; i <= n; i++)pre[i] = i;queue<int> q;q.push(s);inq[s] = true;num[s] += 1;d[s] = 0;while (!q.empty()) {int u = q.front();q.pop();inq[u] = false;for (Node next : Adj[u]) {int v = next.v;int dis = next.dis;if (d[u] + dis < d[v]) {d[v] = d[u] + dis;//优化距离pre[v] = u;//记录最短路径中结点v前驱if (inq[v] == false) {//如果v还没有进队列,就加入队列q.push(v);inq[v] = true;num[v] += 1;if (num[v] >= n)return false;//存在负环,算法找不到最短距离}}//u < pre[v]是关键,因为题目要求找到字典最小的路径//所以我们要求路径长度相同的条件下,每个结点的序号尽可能小else if (d[u] + dis == d[v] && u < pre[v]) {pre[v] = u;}}}return true;
}void DFS(int v) {if (pre[v] == v) {cout << v;return;}DFS(pre[v]);cout << " " << v;
}void init() {for (int i = 0; i <= n; i++) {Adj[i].clear();}
}int main() {int start, dest;while (cin >> n >> m >> start >> dest) {init();int u, v, dis;for (int i = 0; i < m; i++) {cin >> u >> v >> dis;Node next;next.dis = dis;next.v = v;Adj[u].push_back(next);next.v = u;Adj[v].push_back(next);}SPFA(start);if (d[dest] != INF) {cout << d[dest] << endl;DFS(dest);cout << endl;}else {cout << "can't arrive" << endl;}}return 0;
}

codeup:问题 D: 最短路径相关推荐

  1. Codeup 问题 B: 算法7-16:弗洛伊德最短路径算法

    题目描述 在带权有向图G中,求G中的任意一对顶点间的最短路径问题,也是十分常见的一种问题. 解决这个问题的一个方法是执行n次迪杰斯特拉算法,这样就可以求出每一对顶点间的最短路径,执行的时间复杂度为O( ...

  2. Codeup墓地-问题 D: 最短路径

    题目描述 有n个城市m条道路(n<1000, m<10000),每条道路有个长度,请找到从起点s到终点t的最短距离和经过的城市名. 输入 输入包含多组测试数据. 每组第一行输入四个数,分别 ...

  3. Codeup墓地-问题 B: 算法7-16:弗洛伊德最短路径算法

    题目描述 在带权有向图G中,求G中的任意一对顶点间的最短路径问题,也是十分常见的一种问题. 解决这个问题的一个方法是执行n次迪杰斯特拉算法,这样就可以求出每一对顶点间的最短路径,执行的时间复杂度为O( ...

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

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

  5. codeup墓地目录(算法笔记习题刷题笔记)

    在线codeup contest 地址:http://codeup.cn/contest.php Contest100000575 - <算法笔记>3.1小节--入门模拟->简单模拟 ...

  6. codeup墓地目录

    代码内容为原创C++ 在线codeup contest 地址:http://codeup.cn/contest.php Contest100000575 - <算法笔记>3.1小节--入门 ...

  7. Codeup墓地-1956

    Codeup墓地-1956 src:http://codeup.cn/problem.php?id=1956 1956: 最短路径 时间限制: 1 Sec 内存限制: 32 MB 题目描述 N个城市, ...

  8. Warshall算法多源点之间最短路径的算法最短距离

    简介:Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系 ...

  9. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

最新文章

  1. Linux上部署、安装nodejs
  2. 其他算法-高斯混合模型
  3. perl随机打乱数组
  4. HttpEntity.EMPTY属性代码示例
  5. mysql简单创建数据库权限(待修改备注)
  6. jboss7.1.安装配置
  7. struts2 - ation 访问 Servlet api
  8. Android字数限制的EditText实现方案研究
  9. WordPress 在function.php 文件中方法中the_XXX方法失效
  10. 文件管理器之字符和编码
  11. java 模式匹配_java模式匹配之蛮力匹配
  12. C# 将JSON数组转化为对象
  13. 计算机自动获取ip地址的协议,自动获取ip地址_计算机是如何自动获取的IP地址的...
  14. 第五人格为什么服务器维护中,《第五人格》提前停服原因和不删档测试说明
  15. Layaair 不规则碰撞检测 UI
  16. 图片太多怎么办?教你怎么批量压缩图片大小
  17. 【更新1.0:PoC发布】CVE-2020-1350: Windows DNS Server蠕虫级远程代码执行漏洞通告
  18. 浅谈C语言(初学者)
  19. java 线性回归_Java实现一元线性回归
  20. 一流管理者,都不会选“先做再说”

热门文章

  1. 无人驾驶汽车系统入门——基于Frenet优化轨迹的无人车动作规划方法
  2. 机器学习,就用Python!五大专家详解其优势何在
  3. Python 3 尴尬了这么久,终于有救了
  4. 上班第一天公司要你用Spring Boot 实现万能文件在线预览
  5. Spring Boot 3.0.0 发布第一个里程碑版本M1,你的 Java 升到 17 了吗?
  6. 限量!Alibaba首发“Java成长笔记”,差距不止一点点
  7. 淘宝开源代码质量检测工具!
  8. 面试官问:你来讲下Netty通信中的粘包、拆包?
  9. 清华大学唐杰教授:人工智能的十年总结
  10. 顶尖985高校,异地布局!