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. python3爬虫-通过selenium获取到dj商品

    from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.c ...

  2. 记换换回收一个js逆向分析

    随着现在对数据的重视程度越来越高,现在各大网站都加强了反爬技术,比如本文中js加密 url地址:https://www.huanhuanhuishou.com/gujia/22201.html 需要爬 ...

  3. JavaWeb基础—EL表达式与JSTL标签库

    EL表达式: EL 全名为Expression Language.EL主要作用 获取数据(访问对象,访问数据,遍历集合等) 执行运算 获取JavaWeb常用对象 调用Java方法(EL函数库) 给出一 ...

  4. daily Tip

    daily tip :   <UserControl.Resources>         <Storyboard x:Name="sb1" x:Key=&quo ...

  5. WPF Expander获得ToggleButton

    原文:WPF Expander获得ToggleButton ToggleButton m_ToggleButton = this.Template.FindName("HeaderSite& ...

  6. Linux5下安装MySQL过程记录

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页     回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackgao@gmail. ...

  7. mfc 形式参数初始化

    初始化函数形参 int add(int a,int b) { return a+b; } add(,); ,,char*s=NULL) { printf("a=%d,b=%d,c=%d\n& ...

  8. 可变多隐层神经网络的python实现

    说明:这是我对网上代码的改写版本,目的是使它跟前一篇提到的使用方法尽量一致,用起来更直观些. 此神经网络有两个特点: 1.灵活性 非常灵活,隐藏层的数目是可以设置的,隐藏层的激活函数也是可以设置的 2 ...

  9. Famous框架系列一:famous/core/Surface

    famous/core/Surface 既然是Famous的第一篇文章,就先给Famous打个广告:http://periodic.famo.us  Famous12年的作品,点击右下角Fun thi ...

  10. avascript小技巧

    avascript小技巧 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture() ...