1087. All Roads Lead to Rome (30)

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<=N<=200), 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 recommended. 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 recommended 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

分析:这是一道图的遍历题目,但是涉及到多个判断标准。首先,路径长度(花费)最小。其次,获得的happy值最大。再次,happy的平均值最大(不包括开始的城市).虽然增加了判断标准,但是做法还是一样的。该题基于图的深度遍历DFS来做,每次遍历到目的节点时更新判断标准。另外,图的DFS与数的DFS不同的地方在于,图的DFS需要增加一个vis数组用于表示某个节点是否访问过,而树不需要,因为树是不含环的。另外,该题给的是字符串表示的节点,我们可以用map来实现字符串和int型之间的映射,方便编写代码。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
using namespace std; const int maxn=;
const int INF=1e9; int g[maxn][maxn];
int happy[maxn];
int vis[maxn]={false}; map<string ,int> str2int;
map<int,string> int2str; int st,ed;
vector<int> tmppath,path;
int min_cost=INF;
int max_happy=;
int avg_happy=;
int lest_num=; int n; void dfs(int s,int cost,int hy)
{
vis[s]=true;
if(s==ed)
{
if(cost<min_cost)
{
min_cost=cost;
path=tmppath;
lest_num=;
max_happy=hy;
avg_happy=hy/(path.size()-);
}
else if(cost==min_cost)
{
lest_num+=;
if(hy>max_happy)
{
max_happy=hy;
path=tmppath;
avg_happy=hy/(path.size()-);
}
else if(hy==max_happy)
{
if(tmppath.size()<path.size()&&tmppath.size()>)
{
path=tmppath;
int down=path.size()-;
avg_happy=hy/down;
}
}
}
return ;
}
for(int v=;v<n;v++)
{
if(vis[v]==false&&g[s][v]!=INF)
{
tmppath.push_back(v); dfs(v,cost+g[s][v],hy+happy[v]);
vis[v]=false;
tmppath.pop_back();
}
}
} int main()
{
fill(g[],g[]+maxn*maxn,INF);
int k;
string begin;
cin>>n>>k>>begin;
str2int.insert(make_pair(begin,));
int2str.insert(make_pair(,begin));
for(int i=;i<n;i++)
{
string str;
int h;
cin>>str>>h;
if(str=="ROM") ed=i;
str2int.insert(make_pair(str,i));
int2str.insert(make_pair(i,str));
happy[i]=h;
}
for(int i=;i<k;i++)
{
string u,v;
int cost;
cin>>u>>v>>cost;
int uu,vv;
uu=str2int[u];
vv=str2int[v];
g[uu][vv]=g[vv][uu]=cost;
}
tmppath.push_back();
dfs(,,);
cout<<lest_num<<" "<<min_cost<<" "<<max_happy<<" "<<avg_happy<<endl; for(int i=;i<path.size();i++)
{
if(i>) cout<<"->";
cout<<int2str[path[i]];
}
}

[图的遍历&多标准] 1087. All Roads Lead to Rome (30)的更多相关文章

  1. 1087. All Roads Lead to Rome (30)

    时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Indeed there are many different ...

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

  3. PAT (Advanced Level) 1087. All Roads Lead to Rome (30)

    暴力DFS. #include<cstdio> #include<cstring> #include<cmath> #include<vector> # ...

  4. 【PAT甲级】1087 All Roads Lead to Rome (30 分)(dijkstra+dfs或dijkstra+记录路径)

    题意: 输入两个正整数N和K(2<=N<=200),代表城市的数量和道路的数量.接着输入起点城市的名称(所有城市的名字均用三个大写字母表示),接着输入N-1行每行包括一个城市的名字和到达该 ...

  5. PAT甲级练习 1087 All Roads Lead to Rome (30分) 字符串hash + dijkstra

    题目分析: 这题我在写的时候在PTA提交能过但是在牛客网就WA了一个点,先写一下思路留个坑 这题的简单来说就是需要找一条最短路->最开心->点最少(平均幸福指数自然就高了),由于本题给出的 ...

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

  7. pat1087. All Roads Lead to Rome (30)

    1087. All Roads Lead to Rome (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...

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

  9. PAT甲级1087. All Roads Lead to Rome

    PAT甲级1087. All Roads Lead to Rome 题意: 确实有从我们这个城市到罗马的不同的旅游线路.您应该以最低的成本找到您的客户的路线,同时获得最大的幸福. 输入规格: 每个输入 ...

随机推荐

  1. uboot的静默编译、指定编译目录、多核编译

    最近在移植uboot,发现每次看源代码,都有编译留下的.o 等各种文件,在百度中,找到了解决方法. 在顶层的Makefile文件中,大概80多行,有这么几句注释, # kbuild supports ...

  2. 关于Linux的交叉编译环境配置中的问题

    Linux的交叉编译arm-linux-gcc搭建时,安装结束却无法查看版本.输入以下命令查看Ubuntu的版本: uname -a 可以看到此Ubuntu为64位16.04.1版本,所以需要下载32 ...

  3. 大数据入门第五天——离线计算之hadoop(下)hadoop-shell与HDFS的JavaAPI入门

    一.Hadoop Shell命令 既然有官方文档,那当然先找到官方文档的参考:http://hadoop.apache.org/docs/current/hadoop-project-dist/had ...

  4. Keil 中的Code,RO-data,RW-data,ZI-data

    我们开发项目中,编译.链接完成后,都要看一下RAM和Flash的利用情况,尤其在有bootloader的情况下,确保自己的单片机选型能符合项目的要求.其中ARM程序的组成,是很容易混淆的.此处所说的“ ...

  5. 洛谷 P4430 小猴打架

    洛谷 P4430 小猴打架 题目描述 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打 ...

  6. Wannafly挑战赛5 D. 子序列

    D. 子序列 链接 #include<cstdio> #include<algorithm> #include<cstring> #include<iostr ...

  7. CF13E Holes LCT

    CF13E Holes LG传送门 双倍经验题,几乎同[HNOI2010]弹飞绵羊,LCT练手题,LG没有LCT题解于是发一波. 从当前点向目标点连边,构成一棵树,带修改就用LCT动态维护答案,由于不 ...

  8. #2009. 「SCOI2015」小凸玩密室

    神仙题啊.完全想不出 首先看方案.可以从任意一个点开始,在这个点要先走完子树,然后走到父亲,再走兄弟,再走父亲的父亲,父亲的兄弟..一直走到1,1的另外一个子树,结束. 完全不会鸭.jpg 设f[i] ...

  9. 四 Hive整合HBase

    安装环境: hbase版本:hbase-1.4.0-bin.tar.gz hive版本:   apache-hive-1.2.1-bin.tar 注意请使用高一点的hbase版本,不然就算hive和h ...

  10. centos6.5部署gitlab

    安装过程参考: https://www.cnblogs.com/wenwei-blog/p/5861450.html https://ehlxr.me/2016/07/31/CentOS-%E7%B3 ...