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
 #include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
int G[][], happy[];
int visit[], dst[];
vector<int> pre[];
const int INF = ;
map<string, int> str2num;
map<int, string> num2str;
int N, K;
string start, fina = "ROM";
int start_, fina_, cnt = ;
void dijkstra(int s){
fill(visit, visit + , );
fill(dst, dst + , INF);
dst[s] = ;
for(int i = ; i < N; i++){
int u = -, minLen = INF;
for(int j = ; j < N; j++){
if(visit[j] == && dst[j] < minLen){
minLen = dst[j];
u = j;
}
}
if(u == -)
return;
visit[u] = ;
for(int j = ; j < N; j++){
if(visit[j] == && G[u][j] != INF){
if(G[u][j] + dst[u] < dst[j]){
dst[j] = G[u][j] + dst[u];
pre[j].clear();
pre[j].push_back(u);
}else if(G[u][j] + dst[u] == dst[j]){
pre[j].push_back(u);
}
}
}
}
} vector<int> path, ans;
int pathNum = , maxHapp = -, maxNum = -;
void DFS(int vt){
path.push_back(vt);
if(vt == start_){
pathNum++;
int sumTemp = ;
for(int i = path.size() - ; i >= ; i--){
sumTemp += happy[path[i]];
}
if(sumTemp > maxHapp){
maxNum = path.size() - ;
maxHapp = sumTemp;
ans = path;
}else if(sumTemp == maxHapp && path.size() < maxNum){
maxNum = path.size() - ;
maxHapp = sumTemp;
ans = path;
}
path.pop_back();
return;
}
int Len = pre[vt].size();
for(int i = ; i < Len; i++){
DFS(pre[vt][i]);
}
path.pop_back();
return;
}
int strNum(string ss){
if(str2num.count(ss) == ){
str2num[ss] = cnt;
num2str[cnt] = ss;
return cnt++;
}else{
return str2num[ss];
}
}
int main(){
cin >> N >> K >> start;
string temps, temps2;
fill(G[], G[] + *, INF);
int tempL;
for(int i = ; i < N - ; i++){
cin >> temps >> tempL;
happy[strNum(temps)] = tempL;
}
for(int i = ; i < K; i++){
cin >> temps >> temps2 >> tempL;
int u1 = strNum(temps), u2 = strNum(temps2);
G[u1][u2] = G[u2][u1] = tempL;
}
start_ = strNum(start);
fina_ = strNum(fina);
dijkstra(start_);
int costSum = dst[fina_];
DFS(fina_);
printf("%d %d %d %d\n%s", pathNum, costSum, maxHapp, maxHapp / maxNum, num2str[start_].c_str());
for(int i = ans.size() - ; i >= ; i--){
printf("->%s", num2str[ans[i]].c_str());
}
cin >> N;
return ;
}

总结:

1、题意:求出最短路,如果有多条,则求出一路上点权之和(开始节点不计入)最大的一条,如果还有多条,则求出点权之和的均值最大的一条(依然不计入开始节点)。

2、输入的城市名字通过map转化为整数节点,使用一个全局变量cnt分配节点编号。

3、pre[K]表示K节点的所有前驱节点。整个pre数组需要从目的地节点回溯到开始节点。

A1087. All Roads Lead to Rome的更多相关文章

  1. PAT甲级——A1087 All Roads Lead to Rome【30】

    Indeed there are many different tourist routes from our city to Rome. You are supposed to find your ...

  2. PAT_A1087#All Roads Lead to Rome

    Source: PAT A1087 All Roads Lead to Rome (30 分) Description: Indeed there are many different tourist ...

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

  4. [图的遍历&多标准] 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 ...

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

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

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

  7. PAT1087. All Roads Lead to Rome

    PAT1087. All Roads Lead to Rome 题目大意 给定一个图的边权和点权, 求边权最小的路径; 若边权相同, 求点权最大; 若点权相同, 则求平均点权最大. 思路 先通过 Di ...

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

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

  9. PAT 甲级 1087 All Roads Lead to Rome(SPFA+DP)

    题目链接 All Roads Lead to Rome 题目大意:求符合题意(三关键字)的最短路.并且算出路程最短的路径有几条. 思路:求最短路并不难,SPFA即可,关键是求总路程最短的路径条数. 我 ...

随机推荐

  1. centOS7防火墙关闭失败问题

    CentOS7命令: 查看防火墙状态:firewall-cmd --state 关闭防火墙:systemctl stop firewalld.service 禁止开机自启:systemctl disa ...

  2. vue.js实战——vue 实时时间

    created:实例创建完成后调用,此阶段完成了数据的观测等,但尚未挂载,$el还不可用,需要初始化处理一些数据时会比较有用. mounted:el挂载到实例上后调用,一般我们的第一个业务逻辑会在这里 ...

  3. Hbase存储思想

  4. python学习笔记(11)--数据组织的维度

    数据的操作周期 存储  -- 表示 -- 操作 一维数据表示 如果数据有序,可以使用列表[]:如果数据没有顺序,可以使用集合{} 一维数组存储 存储方式一:空格分隔 ,使用一个或多个空格分隔进行分隔, ...

  5. Java 基础类型 默认值

    (1)数据库里的列,如果有默认值,不能赋值有业务含义的值. (2)int 默认值 java会分配默认值的额.

  6. 去掉dede织梦position当前位置最后一个箭头的方法

    理论是,dede的当前位置标签{dedefield name='position'}结构是 首页 > 主栏目 > 子栏目 > ,这就说明,而箭头符号字段数据都是在后台设置后存储在数据 ...

  7. 一个实际的案例介绍Spring Boot + Vue 前后端分离

    介绍 最近在工作中做个新项目,后端选用Spring Boot,前端选用Vue技术.众所周知现在开发都是前后端分离,本文就将介绍一种前后端分离方式. 常规的开发方式 采用Spring Boot 开发项目 ...

  8. 错误模块名称: KERNELBASE.dll

    部署win服务时,经常会出现类似下面的错误,错误模块名称: KERNELBASE.dll. 日志名称:          Application 来源:            Application ...

  9. spawn

    转载:http://motioo.blog.163.com/blog/static/117718291200954102830215/ 并行计算使用的节点数在开始运行程序时进行指定. 学习了FFT之后 ...

  10. 如何使用CSS 让Table的最后一列的右边框不显示

    table{ border-collapse:collapse; } .templateColumn{ border-right:1px solid #AAA; } table.templateCon ...