1030 Travel Plan
A traveler's map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a program to help a traveler to decide the shortest path between his/her starting city and the destination. If such a shortest path is not unique, you are supposed to output the one with the minimum cost, which is guaranteed to be unique.
Input Specification:
Each input file contains one test case. Each case starts with a line containing 4 positive integers N, M, S, and D, where N (≤) is the number of cities (and hence the cities are numbered from 0 to N−1); M is the number of highways; S and D are the starting and the destination cities, respectively. Then M lines follow, each provides the information of a highway, in the format:
City1 City2 Distance Cost
where the numbers are all integers no more than 500, and are separated by a space.
Output Specification:
For each test case, print in one line the cities along the shortest path from the starting point to the destination, followed by the total distance and the total cost of the path. The numbers must be separated by a space and there must be no extra space at the end of output.
Sample Input:
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
Sample Output:
0 2 3 3 40
题意:
最短路问题。
思路:
这道题用到了Dijkstra算法和DFS算法,想要解这道题还得要完全的搞明白Dijkstra算法寻找最短路的原理。Dijkstra算法的工作原理是从起点开始不断地向外拓展与起点相连的点,然后在这些点中找出到起点距离最短的点,以此为新的起点再向外拓展,直至遍历完图中的每一个结点。遍历的过程中需要记录到该结点最短路径的前驱结点。因为这样的结点可能不止一个,所以需要用一个与这个结点相关的数组专门存储。
遍历完图中的每一个节点后,也就把到每一结点的最短路径记录下来了。然后通过DFS从终点开始反向遍历,寻找花费最小的最短路径。
本题用邻接矩阵来表示图的信息。
Code:
1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 const int inf = 0x7fffffff;
6
7 int n, m, s, d;
8 // 用来存储图的信息
9 vector<vector<int> > grap(505, vector<int>(505, inf));
10 // 用来存储图中每条边的花费
11 vector<vector<int> > cost(505, vector<int>(505, inf));
12 // 用来标记图中的那个结点是否已经被访问过
13 vector<bool> visited(505, false);
14 // 记录每个结点到达起点的位置
15 vector<int> dis(505, inf);
16 // 用来存储最短路径的信息
17 vector<int> path, tempPath;
18 // 记录每个结点的前驱结点
19 vector<int> pre[505];
20 int minCost = inf;
21
22 void dfs(int v) {
23 tempPath.push_back(v);
24 if (v == s) {
25 int tempCost = 0;
26 int tempDis = 0;
27 int len = tempPath.size();
28 for (int i = len - 1; i > 0; --i) {
29 tempCost += cost[tempPath[i]][tempPath[i - 1]];
30 }
31 if (minCost > tempCost) {
32 minCost = tempCost;
33 path = tempPath;
34 }
35 tempPath.pop_back();
36 return;
37 }
38 for (int it : pre[v]) dfs(it);
39 tempPath.pop_back();
40 }
41
42 int main() {
43 cin >> n >> m >> s >> d;
44 int c1, c2, t, money;
45 for (int i = 0; i < m; ++i) {
46 cin >> c1 >> c2 >> t >> money;
47 grap[c1][c2] = grap[c2][c1] = t;
48 cost[c1][c2] = cost[c2][c1] = money;
49 }
50 dis[s] = 0;
51 pre[s].push_back(s);
52 // 运用Dijkstra算法寻找每个结点到起点的最小距离。
53 for (int i = 0; i < n; ++i) {
54 int u = -1, minn = inf;
55 for (int j = 0; j < n; ++j) {
56 if (visited[j] == false && dis[j] < minn) {
57 u = j;
58 minn = dis[j];
59 }
60 }
61 // 表明与起点联通的结点已经遍历完毕
62 if (u == -1) break;
63 visited[u] = true;
64 // 寻找与u相连的结点,并更新其最短距离
65 for (int j = 0; j < n; ++j) {
66 if (visited[j] == false && grap[u][j] != inf) {
67 if (dis[j] > dis[u] + grap[u][j]) {
68 dis[j] = dis[u] + grap[u][j];
69 pre[j].clear();
70 pre[j].push_back(u);
71 } else if (dis[j] == dis[u] + grap[u][j]) {
72 pre[j].push_back(u);
73 }
74 }
75 }
76 }
77 dfs(d);
78
79 for (int i = path.size() - 1; i >= 0; --i) cout << path[i] << " ";
80 cout << dis[d] << " " << minCost << endl;
81
82 return 0;
83 }
虽然知道这是使用那种算法,但是写代码的时候还是不知道从哪里开始写。
参考:
https://www.liuchuo.net/archives/2369
1030 Travel Plan的更多相关文章
- PAT 1030 Travel Plan[图论][难]
1030 Travel Plan (30)(30 分) A traveler's map gives the distances between cities along the highways, ...
- 1030 Travel Plan (30 分)
1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, toge ...
- [图算法] 1030. Travel Plan (30)
1030. Travel Plan (30) A traveler's map gives the distances between cities along the highways, toget ...
- PAT 甲级 1030 Travel Plan (30 分)(dijstra,较简单,但要注意是从0到n-1)
1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, to ...
- PAT A 1030. Travel Plan (30)【最短路径】
https://www.patest.cn/contests/pat-a-practise/1030 找最短路,如果有多条找最小消耗的,相当于找两次最短路,可以直接dfs,数据小不会超时. #incl ...
- 1030. Travel Plan (30)
时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A traveler's map gives the dista ...
- PAT (Advanced Level) 1030. Travel Plan (30)
先处理出最短路上的边.变成一个DAG,然后在DAG上进行DFS. #include<iostream> #include<cstring> #include<cmath& ...
- 1030 Travel Plan Dijkstra+dfs
和1018思路如出一辙,先求最短路径,再dfs遍历 #include <iostream> #include <cstdio> #include <vector> ...
- PAT甲题题解-1030. Travel Plan (30)-最短路+输出路径
模板题最短路+输出路径如果最短路不唯一,输出cost最小的 #include <iostream> #include <cstdio> #include <algorit ...
- PAT 甲级 1030 Travel Plan
https://pintia.cn/problem-sets/994805342720868352/problems/994805464397627392 A traveler's map gives ...
随机推荐
- LeetCode-二叉搜索树的第k大节点
二叉搜索树的第k大节点 LeetCode-面试题54 需要充分了解二叉搜索树的性质. 利用中序遍历的思想,采用相反的思想:先遍历右节点再遍历左节点. /** * 给定一棵二叉搜索树,请找出其中第k大的 ...
- Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式
封面:洛小汐 作者:潘潘 一直以来 他们都说为了生活 便追求所谓成功 顶级薪水.名牌包包 还有学区房 · 不过 总有人丢了生活 仍一无所获 · 我比较随遇而安 有些事懒得明白 平日里问心无愧 感兴趣的 ...
- HashMap之tableSizeFor方法图解
目录 普通人的简单粗暴方式 示例代码 问题 大神的实现 移位的思想 全过程示意图 初始值 右移一位+或运算 右移二位+或运算 右移四位+或运算 右移八位+或运算 右移十六位+或运算 结果+1 初始容量 ...
- MyBatis(八):MyBatis插件机制详解
MyBatis插件插件机制简介 MyBatis插件其实就是为使用者提供的自行拓展拦截器,主要是为了可以更好的满足业务需要. 在MyBatis中提供了四大核心组件对数据库进行处理,分别是Exec ...
- Memory Networks01 记忆网络经典论文
目录 1.Memory Networks 框架 流程 损失函数 QA 问题 一些扩展 小结 2.End-To-End Memory Networks Single Layer 输入模块 算法流程 Mu ...
- [SNOI2019] 通信
一.题目 点此看题 二.解法 一看就是傻逼补流模型,不会真的有人这个图都建不出来吧 别走啊,我不阴阳怪气了,如果你不知道怎么建这里有图嘛(思路来源是餐巾计划问题): 其中标红的边数量级很大,因为 \( ...
- Java 并发编程之 Condition 接口
本文部分摘自<Java 并发编程的艺术> 概述 任意一个 Java 对象,都拥有一个监视器方法,主要包括 wait().wait(long timeout).notify() 以及 not ...
- scala集合上常用的方法
sacala 关于集合常用的操作 map1.映射:对集合中的每一个元素进行执行某一项操作2.返回值类型,正常情况不变,原来集合是什么类型,就返回什么类型3.元素类型,根据我们函数的返回值类型 val ...
- CSS浮动布局带来的高度塌陷以及其解决办法
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- 项目实战:Qt+C#轨道交通行业高性能高流畅度模拟火车移动图像控件
需求 高清线阵相机扫描火车并自动切割单节车厢完成图像合成.通过视频图像处理组件流畅模拟火车行驶整个过程的视频图像: 1.模拟火车通过时的滚动图像,图像主要以两侧和顶部图像的预览为主; 2.模拟 ...