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 ...
随机推荐
- Redis操作指南
目录 Redis安装与使用教程 一.Redis介绍 1.redis安装 2.redis与mysql的异同 3.redis与memcache的异同 二.Redis操作 1.启动服务 2.密码管理 3.连 ...
- 低功耗蓝牙 ATT/GATT/Service/Characteristic 规格解读
什么是蓝牙service和characteristic?如何理解蓝牙profile? ATT和GATT两者如何区分?什么是attribute? attribute和characteristic的区别是 ...
- vue关于导航守卫的几种应用场景
beforeEach 该钩子函数主要用来做权限的管理认证 router.beforeEach((to, from, next) => { if (to.matched.some(record = ...
- 《C++ Primer》笔记 第12章 动态内存
shared_ptr和unique_ptr都支持的操作 解释 shared_ptr sp或unique_ptr up 空智能指针,可以指向类型为T的对象 p 将p用作一个条件判断,若p指向一个对象,则 ...
- PAT-1146(Topological Order)拓扑排序+判断一个序列是否满足拓扑序列
Topological Order PAT-1146 #include<iostream> #include<cstring> #include<string> # ...
- POJ-1511(Dijkstra+优先队列优化+向前星)
Invitation Cards POJ-1511 从这道题我还是发现了很多的问题,首先就是快速输入输出,这里的ios::---这一行必须先放在main函数第一行,也就是输入最开始的前面,否则系统疯狂 ...
- 【白话科普】CDN & 游戏加速器,两者是一个原理吗?
说起加速,大家可能就会联想到"游戏加速"之类的场景,而说到现在流行的云服务加速,则离不开 CDN 这个词.那么 CDN 和游戏加速器是同一种东西么?从效果上看两者都是为了" ...
- mysql内一些可以报错注入的查询语句
一.exp() 取反参数 该函数简单来说就是,以e为底的对数,在当传递一个大于709的值时,函数exp()就会引起一个溢出错误,取反则可以导致很小的数值变得很大,比如说0 这样既可配合使用,e ...
- 如何自学成 Python 大神?这里有些建议
人生苦短,我用 Python.为什么?简单明了的理由当然是开发效率高.但是学习 Python 的初学者往往会面临以下残酷的现状:网上充斥着大量的学习资源.书籍.视频教程和博客,但是大部分都是讲解基础知 ...
- Ubuntu pip版本的安装,卸载,查看,更新
pip版本的安装: sudo apt-get install python3-pip pip版本的查看: pip3 --version pip3 -V pip更新: sudo pip3 install ...