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. Kafka内核理解:消息的收集/消费机制

    原文:https://www.cnblogs.com/daochong/p/6425762.html 一.Kafka数据收集机制 Kafka集群中由producer负责数据的产生,并发送到对应的Top ...

  2. 【转载】屏幕坐标向3维坐标的转化-DXUT的CD3DArcBall类

    原文:http://blog.csdn.net/bluekitty/article/details/6070828 3D应用程序中,我们可以通过鼠标进行空间中物体的旋转和视角的变换等,而鼠标的移动是2 ...

  3. java学习(五)Number类、Math类

    Number类 顾名思义嘛,搞数字的,以前也用到过,就是相当于内置了一堆数字的类嘛,用哪种类型的就引用下这个包就好了呗 Integer.Long.Byte.Double.Float.Short都是Nu ...

  4. JUC——阻塞队列

    Queue是一个队列,而队列的主要特征是FIFO先进先出,要实现生产者与消费者模型,也可以采用队列来进行中间的缓冲读取,好处是:生产者可以一直不停歇的生产数据. BlockingQueue是Queue ...

  5. python里的魔法方法1(构造与析构)

    魔法方法——构造与析构 1.python编程的魔法方法: (1)魔法方法总是被双下划线包围,例如__init__: (2)魔法方法是面向对象的python的一切. 2.__new__(class[,… ...

  6. 角色和武器Shader特效开发

    角色Shader的动效需求 角Shader的开发不知要实现最基础光照等功能, 可能还要在角色武器的Shader增加多种动效, 比如因武器品质区分的流光特效, 被技能击中时的冻结效果. 这类动效的实现方 ...

  7. Unity优化方向——优化Unity游戏中的图形渲染(译)

    CPU bound:CPU性能边界,是指CPU计算时一直处于占用率很高的情况. GPU bound:GPU性能边界,同样的是指GPU计算时一直处于占用率很高的情况. 原文:https://unity3 ...

  8. Laya资源加载小记

    Laya.Loader负责资源的加载逻辑,被LoaderManager管理. Laya支持多种类型资源加载,也支持自定义类型加载.不同类型的加载方式可能不同. Laya.Loader缓存已经被加载过得 ...

  9. Netty源码分析第2章(NioEventLoop)---->第1节: NioEventLoopGroup之创建线程执行器

    Netty源码分析第二章: NioEventLoop 概述: 通过上一章的学习, 我们了解了Server启动的大致流程, 有很多组件与模块并没有细讲, 从这个章开始, 我们开始详细剖析netty的各个 ...

  10. 程序员应该懂的ip地址知识汇总

    1.A类ip由1字节(1字节是8位2进制数)的网络地址和3字节的主机地址组成,网络地址最高位必须是0,地址范围是从1.0.0.0到126.0.0.0,所以A类网络地址有126个,每个网络能容纳至少2^ ...