1087 All Roads Lead to Rome
Indeed there are many different tourist routes from our city to Rome. You are supposed to find your clients the route with the least cost while gaining the most happiness.
Input Specification:
Each input file contains one test case. For each case, the first line contains 2 positive integers N (2), the number of cities, and K, the total number of routes between pairs of cities; followed by the name of the starting city. The next N−1 lines each gives the name of a city and an integer that represents the happiness one can gain from that city, except the starting city. Then K lines follow, each describes a route between two cities in the format City1 City2 Cost. Here the name of a city is a string of 3 capital English letters, and the destination is always ROM which represents Rome.
Output Specification:
For each test case, we are supposed to find the route with the least cost. If such a route is not unique, the one with the maximum happiness will be recommanded. If such a route is still not unique, then we output the one with the maximum average happiness -- it is guaranteed by the judge that such a solution exists and is unique.
Hence in the first line of output, you must print 4 numbers: the number of different routes with the least cost, the cost, the happiness, and the average happiness (take the integer part only) of the recommanded route. Then in the next line, you are supposed to print the route in the format City1->City2->...->ROM.
Sample Input:
6 7 HZH
ROM 100
PKN 40
GDN 55
PRS 95
BLN 80
ROM GDN 1
BLN ROM 1
HZH PKN 1
PRS ROM 2
BLN HZH 2
PKN GDN 1
HZH PRS 1
Sample Output:
3 3 195 97
HZH->PRS->ROM
题意:
题目大体上是一个求最短路的问题,只不过又在此基础上增加了一些其他的内容,比如说:找出最短路的条数,以及路途过程中happinese的最大值和average happinese的最大值问题。
思路:
最短路径涉及到图论,所以就要表示出图,这里我用的是连接矩阵来表示图,所以先用map将城市的名字改成数字,最后输出的时候再改回来。然后就是用Dijkstra来求最短路了。
Code:
#include<iostream>
#include<map>
#include<string>
#include<vector>
#include<stack> using namespace std;
const int Inf = 0x7fffffff; int findMinDist(vector<int> &dist, vector<bool> &collected) {
int ret = Inf, j = -1;
int len = dist.size();
for (int i = 1; i < len; ++i) {
if (!collected[i] && ret > dist[i]) {
ret = dist[i];
j = i;
}
}
return j;
} int main() {
int n, k;
string start; cin >> n >> k >> start; map<string, int> EnToNum;
map<int, string> NumToEn;
EnToNum[start] = 0;
NumToEn[0] = start;
vector<int> happiness(n);
string name;
int value;
for (int i = 1; i < n; ++i) {
cin >> name >> value;
EnToNum[name] = i;
NumToEn[i] = name;
happiness[i] = value;
} vector<vector<int> > martix(n, vector<int>(n, -1));
vector<bool> collected(n, false);
vector<int> path(n, -1);
string name1, name2;
int num1, num2, cost;
for (int i = 0; i < k; ++i) {
cin >> name1 >> name2 >> cost;
num1 = EnToNum[name1];
num2 = EnToNum[name2];
martix[num1][num2] = cost;
martix[num2][num1] = cost;
} vector<int> dist(n, Inf);
dist[0] = 0;
collected[0] = true;
for (int i = 1; i < n; ++i) {
if (martix[0][i] > 0) {
dist[i] = martix[0][i];
path[i] = 0;
}
} int end = EnToNum["ROM"];
vector<pair<int, int> > backtrack;
// Dijkstra算法
while (1) {
int minVertex = findMinDist(dist, collected);
if (minVertex == -1) break;
collected[minVertex] = true;
for (int i = 0; i < n; ++i) {
if (martix[minVertex][i] > 0 && !collected[i]) {
if (dist[minVertex] + martix[minVertex][i] <= dist[i]) {
dist[i] = dist[minVertex] + martix[minVertex][i];
path[i] = minVertex;
if (i == end) {
backtrack.push_back({dist[i], minVertex});
}
}
}
}
} int count = 0;
vector<int> Vbacktrack;
for (int i = 0; i < backtrack.size(); ++i) {
if (backtrack[i].first == dist[end]) {
count++;
Vbacktrack.push_back(backtrack[i].second);
}
} int maxHappinese = -1, aveHappinese = -1;
int maxHappVertex;
for (int i = 0; i < Vbacktrack.size(); ++i) {
int begin = Vbacktrack[i], temp = happiness[end], numOfVertex = 1;
while (path[begin] != -1) {
temp += happiness[begin];
numOfVertex++;
begin = path[begin];
}
if (temp > maxHappinese) {
maxHappinese = temp;
aveHappinese = temp / numOfVertex;
maxHappVertex = Vbacktrack[i];
} else if (temp == maxHappinese && aveHappinese < temp/numOfVertex) {
aveHappinese = temp / numOfVertex;
maxHappVertex = Vbacktrack[i];
}
} cout << dist[end] << " " << count << " " << maxHappinese << " " << aveHappinese << endl; stack<int> pathToRom;
pathToRom.push(end);
while (path[maxHappVertex] != -1) {
pathToRom.push(maxHappVertex);
maxHappVertex = path[maxHappVertex];
}
cout << start;
while (!pathToRom.empty()) {
cout << "->" << NumToEn[pathToRom.top()];
pathToRom.pop();
}
cout << endl; return 0;
}
搞了半天就通过了一组数据。
1087 All Roads Lead to Rome的更多相关文章
- PAT 1087 All Roads Lead to Rome[图论][迪杰斯特拉+dfs]
1087 All Roads Lead to Rome (30)(30 分) Indeed there are many different tourist routes from our city ...
- [图的遍历&多标准] 1087. All Roads Lead to Rome (30)
1087. All Roads Lead to Rome (30) Indeed there are many different tourist routes from our city to Ro ...
- PAT 1087 All Roads Lead to Rome
PAT 1087 All Roads Lead to Rome 题目: Indeed there are many different tourist routes from our city to ...
- PAT甲级1087. All Roads Lead to Rome
PAT甲级1087. All Roads Lead to Rome 题意: 确实有从我们这个城市到罗马的不同的旅游线路.您应该以最低的成本找到您的客户的路线,同时获得最大的幸福. 输入规格: 每个输入 ...
- PAT 甲级 1087 All Roads Lead to Rome(SPFA+DP)
题目链接 All Roads Lead to Rome 题目大意:求符合题意(三关键字)的最短路.并且算出路程最短的路径有几条. 思路:求最短路并不难,SPFA即可,关键是求总路程最短的路径条数. 我 ...
- 1087. All Roads Lead to Rome (30)
时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Indeed there are many different ...
- PAT 甲级 1087 All Roads Lead to Rome
https://pintia.cn/problem-sets/994805342720868352/problems/994805379664297984 Indeed there are many ...
- 1087 All Roads Lead to Rome (30)(30 分)
Indeed there are many different tourist routes from our city to Rome. You are supposed to find your ...
- 1087 All Roads Lead to Rome (30 分)(最短路径)
直接用Dijkstra做 #include<bits/stdc++.h> using namespace std; int n,m; map<string,int>si; ma ...
随机推荐
- HTTP头Content-Type类型记录
默认发POST格式 Content-Type: application/x-www-form-urlencoded Content-Type: application/x-www-form-urlen ...
- 测试平台系列(2) 给Pity添加配置
给Pity添加配置 回顾 还记得上篇文章创立的「Flask」实例吗?我们通过这个实例,给根路由 「/」 绑定了一个方法,从而使得用户访问不同路由的时候可以执行不同的方法. 配置 要知道,在一个「Web ...
- C# 读取Word文本框中的文本、图片和表格(附VB.NET代码)
[概述] Word中可插入文本框,在文本框中可添加文本.图片.表格等内容.本篇文章通过C#程序代码介绍如何来读取文本框中的文本.图片和表格等内容.附VB.NET代码,有需要可作参考. [程序环境] 程 ...
- LNMP配置——Nginx配置 —— 默认虚拟主机
一.配置 首先修改配置文件 #vi /usr/local/nginx/conf/nginx.conf 在最后一个结束符号}前加一行配置: include vhost/*.conf; 意思就是/usr/ ...
- Spark SQL中Not in Subquery为何低效以及如何规避
首先看个Not in Subquery的SQL: // test_partition1 和 test_partition2为Hive外部分区表 select * from test_partition ...
- 双向链表及有关操作(C语言)
#include <stdio.h> #include <stdlib.h> /** * 含头节点双向链表定义及有关操作 */ //操作函数用到的状态码 #define TRU ...
- C# 自定义时间进度条
这篇文章对我帮助极大,我模仿着写了两遍大概摸清楚了自定义控件的流程.https://www.cnblogs.com/lesliexin/p/13265707.html 感谢大佬 leslie_xin ...
- x86汇编 条件跳转
条件跳转表 汇编语言-条件跳转指令 直接转移指令 指令格式 机器码 测试标志 条件说明 符号 JO OPR 70 OF=1 结果有溢出 JNO OPR 71 OF= ...
- 浅析MyBatis(三):聊一聊MyBatis的实用插件与自定义插件
在前面的文章中,笔者详细介绍了 MyBatis 框架的底层框架与运行流程,并且在理解运行流程的基础上手写了一个自己的 MyBatis 框架.看完前两篇文章后,相信读者对 MyBatis 的偏底层原理和 ...
- 2,turicreate入门 - 一个简单的回归模型
turicreate入门系列文章目录 1,turicreate入门 - jupyter & turicreate安装 2,turicreate入门 - 一个简单的回归模型 3,turicrea ...