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的更多相关文章

  1. PAT 1030 Travel Plan[图论][难]

    1030 Travel Plan (30)(30 分) A traveler's map gives the distances between cities along the highways, ...

  2. 1030 Travel Plan (30 分)

    1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, toge ...

  3. [图算法] 1030. Travel Plan (30)

    1030. Travel Plan (30) A traveler's map gives the distances between cities along the highways, toget ...

  4. 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 ...

  5. PAT A 1030. Travel Plan (30)【最短路径】

    https://www.patest.cn/contests/pat-a-practise/1030 找最短路,如果有多条找最小消耗的,相当于找两次最短路,可以直接dfs,数据小不会超时. #incl ...

  6. 1030. Travel Plan (30)

    时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A traveler's map gives the dista ...

  7. PAT (Advanced Level) 1030. Travel Plan (30)

    先处理出最短路上的边.变成一个DAG,然后在DAG上进行DFS. #include<iostream> #include<cstring> #include<cmath& ...

  8. 1030 Travel Plan Dijkstra+dfs

    和1018思路如出一辙,先求最短路径,再dfs遍历 #include <iostream> #include <cstdio> #include <vector> ...

  9. PAT甲题题解-1030. Travel Plan (30)-最短路+输出路径

    模板题最短路+输出路径如果最短路不唯一,输出cost最小的 #include <iostream> #include <cstdio> #include <algorit ...

  10. PAT 甲级 1030 Travel Plan

    https://pintia.cn/problem-sets/994805342720868352/problems/994805464397627392 A traveler's map gives ...

随机推荐

  1. CNN结构演变总结(一)经典模型

    导言:    自2012年AlexNet在ImageNet比赛上获得冠军,卷积神经网络逐渐取代传统算法成为了处理计算机视觉任务的核心.    在这几年,研究人员从提升特征提取能力,改进回传梯度更新效果 ...

  2. HTTP 请求URL中不能含有空格

    如果含有空格 会报 不合法参数异常 正确做法是将其encode URLEncoder.encode(targetString, "utf-8").replaceAll(" ...

  3. kali 将家目录下的中文文件名修改成英文

    修改vim ~/.config/user-dirs.dirs 打开`文件,删除那些中文目录 在目录下创建英文目录 重启 参考 https://elementaryos.stackexchange.co ...

  4. Bullet碰撞检测

    DBVT 在bullet 引擎中是很基础且重要的一个数据结构,本质上是一个可以动态更新的AABB树. 碰撞响应的分析 约束分类:可积约束,不可积约束 ,摩擦力(见[1]第四章) 整个bullet在动力 ...

  5. MVC base64加密的文件,前端下载

    后端代码: public FileResult OutPutFile(string  base64file,string filename) { buffer = Convert.FromBase64 ...

  6. 【转载】关于grad_tensors的解惑

    转载:https://www.cnblogs.com/marsggbo/p/11549631.html 平常都是无脑使用backward,每次看到别人的代码里使用诸如autograd.grad这种方法 ...

  7. MySQL使用入门--初识数据库

    MySQL使用入门 数据库概述 数据库是存放数据的仓库.在应用的开发中总是离不开数据的查询.处理.存储,例如图书管理系统就需要操纵和存储大量的数据.没有数据库之前我们使用文件存储数据,但是文件存储有很 ...

  8. apicloud打包的ios证书的获取方法

    apicloud云编译的时候,需要测试证书或者正式证书进行编译. 那么这个证书是怎么来的呢?通过什么渠道可以获取呢? 这里我介绍下使用香蕉云编这个在线工具来生成: 1.登录香蕉云编,生成证书的csr文 ...

  9. [LeetCode 279.] Perfect Squres

    LeetCode 279. Perfect Squres DP 是笨办法中的高效办法,又是一道可以被好办法打败的 DP 题. 题目描述 Given a positive integer n, find ...

  10. 局部莫兰指数的计算(运用ArcMap)

    做任务时需要运用到局部莫兰指数,卡在用Python计算的思路上好久,最后发现可以用ArcGIS进行处理,步骤简单易懂. 主要步骤为: 1.读入数据(一定要为shp文件),对于用ecognition直接 ...