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. OLAP分析

    OLAP分析 1 视频教程 视频教程 如果对资源下载.分析操作有疑问,直接跟着视频做一遍即可. 2 数据集合说明 FoodMart,其为一家食品连锁店经营产生的数据存放的数据库,包括销售数据.库存数据 ...

  2. 异常控制流(csapp)

    [前言]程序按照一定顺序执行称为控制转移.最简单的是平滑流,跳转.调用和返回等指令会造成平滑流的突变.系统也需要能够对系统状态的变化做出反应,这些系统状态不能被内部程序变量捕获但是,操作系统通过使控制 ...

  3. uni-app创建项目

    下载 HBuilderX   下载地址(https://www.dcloud.io/hbuilderx.html) HBuilderX是通用的前端开发工具,但为uni-app做了特别强化. 创建uni ...

  4. jQuery实现QQ简易聊天框

    实现效果: html代码: <section id="chat"> <div class="chatBody"></div> ...

  5. c#(NPOI)DataTable导出execl,execl(支持解析公式)导入DataTable

    NPOI(C#)DataTable导出execl using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserMod ...

  6. dubbo实战之二:与SpringBoot集成

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. 将samba共享目录映射为本地文件夹(百度网盘直接下载到samba共享目录下)

    将samba共享目录映射为本地文件夹(百度网盘直接下载到samba共享目录下) 前面淘了一个蜗牛星际的矿机,打算拿来做个个人云盘,就装上了Linux用smb把硬盘共享出来 访问倒是很爽,就是发现下东西 ...

  8. 痞子衡嵌入式:盘点国内Cortex-M内核MCU厂商高性能产品

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是国内Cortex-M内核MCU厂商高性能产品. 在8/16位中低端MCU领域,国内厂商的本土化产品设计以及超低价特点,使得其与国外大厂竞 ...

  9. WDN302国产化网络存储控制模块

    WDN302是一款网络存储控制模块,实现对NAS和IP-SAN的混合支持,通过以太网对海量存储的访问,实现数据的存储.共享.恢复和防丢失. 飞腾 FT1500A/16处理器,主频 1.5GHz: 支持 ...

  10. 图解双链表(Java实现)

    原创公众号:bigsai 文章已收录在 全网都在关注的数据结构与算法学习仓库 前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以但链表为主,但实际上在实际应用中双链表的应用多一些就比如Li ...