Codeup墓地-问题 D: 最短路径
题目描述
有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
#include <iostream>
#include <vector>
using namespace std;const int maxn = 1000;
const int inf = 1000000000;int n, m, s, t; //n个城市,m条道路,起点s,重点t
struct node
{int v;int dis;node(int _x, int _y){v = _x;dis = _y;}
};
vector<node> adj[maxn];
vector<int> pre[maxn];
vector<int> temp, ans;
bool vis[maxn] = {false};
int d[maxn];void dij(int s)
{fill(d, d+maxn, inf);d[s] = 0;for(int i = 0; i < n; i++){int u = -1, min = inf;for(int j = 0; j < n; j++){if(vis[j] == false && d[j] < min){u = j;min = d[j];}}if(u == -1) return;vis[u] = true;for(int j = 0; j < adj[u].size(); j++){int v = adj[u][j].v;if(vis[v] == false){if(d[u] + adj[u][j].dis < d[v]){d[v] = d[u] + adj[u][j].dis;pre[v].clear();pre[v].push_back(u);}else if(d[u] + adj[u][j].dis == d[v]){pre[v].push_back(u);}}}}
}void dfs(int v)
{if(v == s){temp.push_back(v);for(int i = temp.size() - 1; i >= 0; i--){if(ans.size() == 0){ans = temp;}else{if(temp[i] == ans[i]) continue;else if(temp[i] < ans[i]){ans = temp;break;}else if(temp[i] > ans[i]) break;}}temp.pop_back();return;}temp.push_back(v);for(int i = 0; i < pre[v].size(); i++){dfs(pre[v][i]);}temp.pop_back();
}int main()
{scanf("%d%d%d%d", &n, &m, &s, &t);for(int i = 0; i < m; i++){int a, b, d;scanf("%d%d%d", &a, &b, &d);adj[a].push_back(node(b,d));adj[b].push_back(node(a,d));}dij(s);if(d[t] == inf) printf("can't arrive");else{printf("%d\n", d[t]);dfs(t);for(int i = ans.size() - 1; i >= 0; i--){printf("%d ", ans[i]);}}return 0;
}
每次做一遍出来,都是答案错误50%....
排查半天,还是错误50%....
未完待解.....(算法虐我千百遍,我待算法如初恋)
Codeup墓地-问题 D: 最短路径相关推荐
- Codeup墓地-1956
Codeup墓地-1956 src:http://codeup.cn/problem.php?id=1956 1956: 最短路径 时间限制: 1 Sec 内存限制: 32 MB 题目描述 N个城市, ...
- Codeup墓地-1123
Codeup墓地-1123 src:http://codeup.cn/problem.php?id=1123 1123: 确定排序序列 时间限制: 1 Sec 内存限制: 32 MB 题目描述 一个由 ...
- Codeup墓地-1107
Codeup墓地-1107 src:http://codeup.cn/problem.php?id=1107 1107: 欧几里得游戏 时间限制: 1 Sec 内存限制: 32 MB 题目描述 小明和 ...
- Codeup墓地1817号A+B
Codeup墓地链接:http://codeup.cn/ 本题链接:http://codeup.cn/problem.php?cid=100000575&pid=1 问题描述: 问题 B: A ...
- Codeup墓地-2337
Codeup墓地-2337 src:http://codeup.cn/problem.php?id=2337 2337: 阻击火箭队 时间限制: 1 Sec 内存限制: 32 MB 题目描述 小明很喜 ...
- Codeup墓地-1985
Codeup墓地-1985 src:http://codeup.cn/problem.php?id=1985 1985: 任务调度 时间限制: 1 Sec 内存限制: 32 MB 题目描述 读入任务调 ...
- Codeup墓地-2118
Codeup墓地-2118 src:http://codeup.cn/problem.php?id=2118 2118: 非常可乐 时间限制: 1 Sec 内存限制: 32 MB 题目描述 大家一定觉 ...
- Codeup墓地-1098
Codeup墓地-1098 src:http://codeup.cn/problem.php?id=1098 1098: 最少的交换 时间限制: 1 Sec 内存限制: 32 MB 题目描述 现在给你 ...
- Codeup墓地-2117
Codeup墓地-2117 src:http://codeup.cn/problem.php?id=2117 2117: 确定比赛名次 时间限制: 1 Sec 内存限制: 32 MB 题目描述 有N个 ...
最新文章
- Objective-C 注释规范心得
- emctl start dbconsole OC4J_dbconsole*** not found
- java密码框提示_[Java教程]如何实现在密码框如出现提示语
- 【缅怀妈妈系列诗歌】之八:妈妈,我不会忘记
- 京东回应“两年将回购20亿美元股份”;微软即刻关闭全球所有旗下商店;. Net 5首个预览版发布|极客头条...
- linux apache 依赖包,利用 yum 解决 Linux 软件包的依赖关系
- android 5.1 内核版本号,最新的安卓5.1.1 ROOT教程(不需要刷第三方内核)
- python程序中1—10的乘积_[求助]1个数1到10的乘积
- 移动通信USSD业务探讨(转)
- [论文笔记]AlignedReID
- Flask06_ORM多表
- JAVA数据类型与转换
- 奥升德赢得三星SDI锂离子电池添加剂专利案;蜂巢能源完成102.8亿元人民币B轮融资;伊顿、特灵科技、芬美意发布财报 | 能动...
- 我是一名项目经理,把一个项目带崩了--案例分析
- 男人30学php,科学网—男人30岁之前要学的16件事 - 刘石泉的博文
- CAD/CASS批量桩号里程标注插件(6种模式)
- 【超详总结/理解:正则表达式】特点/元字符/正则表达式中的标志位-flag/RegExp/重复操作与后向引用/匹配模式/表达邮箱/正则表达式对象的方法/利用正则表达式限制网页表单里的文本框输入内容
- 关于HTML中的滚动条/去掉滚动条
- python unsigned long_无法将“vectorunsigned long”转换为Python obj
- 受邀参加:2010中国中小企业信息化与成长力推进高峰论坛