本题是一部战争大片 —— 你需要从己方大本营出发,一路攻城略地杀到敌方大本营。首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营。当这样的路径不唯一时,要求选择可以沿途解放最多城镇的路径。若这样的路径也不唯一,则选择可以有效杀伤最多敌军的路径。

输入格式:

输入第一行给出 2 个正整数 N(2 ≤ N ≤ 200,城镇总数)和 K(城镇间道路条数),以及己方大本营和敌方大本营的代号。随后 N-1 行,每行给出除了己方大本营外的一个城镇的代号和驻守的敌军数量,其间以空格分隔。再后面有 K 行,每行按格式城镇1 城镇2 距离给出两个城镇之间道路的长度。这里设每个城镇(包括双方大本营)的代号是由 3 个大写英文字母组成的字符串。

输出格式:

按照题目要求找到最合适的进攻路径(题目保证速度最快、解放最多、杀伤最强的路径是唯一的),并在第一行按照格式己方大本营->城镇1->...->敌方大本营输出。第二行顺序输出最快进攻路径的条数、最短进攻距离、歼敌总数,其间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

10 12 PAT DBY
DBY 100
PTA 20
PDS 90
PMS 40
TAP 50
ATP 200
LNN 80
LAO 30
LON 70
PAT PTA 10
PAT PMS 10
PAT ATP 20
PAT LNN 10
LNN LAO 10
LAO LON 10
LON DBY 10
PMS TAP 10
TAP DBY 10
DBY PDS 10
PDS PTA 10
DBY ATP 10

输出样例:

PAT->PTA->PDS->DBY
3 30 210

分析:本题相对比较简单,只需要根据题目要求调整最短路径的判定条件就好,为了方便操作,这里大本营代号(字符串)与数值之间要做一个映射~ntoi保存名字到编号的转换,iton保存编号到名字的转换,num中储存各个大本营敌军数量,Num中存储歼敌总数,path中存储每个大本营由哪个地方过来的,Dis存储出发点到各点的最短距离,sum中存储路径数,liberation存储了解放的大本营个数~

#include <bits/stdc++.h>
using namespace std;
struct node {int id, dis;bool friend operator < (const node &a, const node &b) {return a.dis > b.dis;}
};
int n, k, s, t, cnt, d, num[205], Num[205], path[205], Dis[205], vis[205], sum[205], liberation[205];
map<string, int> ntoi;
map<int, string> iton;
vector<pair<int, int>> E[205];
vector<int> ans;
string S, T, u, v;
void Dijskra() {fill(Dis, Dis + 205, 1e9);Dis[s] = 0;sum[s] = 1;priority_queue<node> Q;Q.push(node{s, 0});while (!Q.empty()) {int Now = Q.top().id, D = Q.top().dis;Q.pop();if (vis[Now]) continue;vis[Now] = 1;for (auto it : E[Now]) {int V = it.first, DIS = it.second;if (Dis[V] > D + DIS) {Num[V] = Num[Now] + num[V];sum[V] = sum[Now];liberation[V] = liberation[Now] + 1;Dis[V] = D + DIS;Q.push(node{V, Dis[V]});path[V] = Now;} else if (Dis[V] == D + DIS) {sum[V] += sum[Now];if (liberation[V] < liberation[Now] + 1) {liberation[V] = liberation[Now] + 1;Num[V] = Num[Now] + num[V];Q.push(node{V, Dis[V]});path[V] = Now;} else if (liberation[V] == liberation[Now] + 1) {if (Num[V] < Num[Now] + num[V]) {Num[V] = Num[Now] + num[V];Q.push(node{V, Dis[V]});path[V] = Now;}}}}}
}
int main() {cin >> n >> k >> S >> T;for (int i = 0; i < n - 1; i++) {cin >> u >> d;ntoi[u] = ++cnt;iton[cnt] = u;num[cnt] = d;}ntoi[S] = 0, iton[0] = S, t = ntoi[T];for (int i = 0; i < k; i++) {cin >> u >> v >> d;E[ntoi[u]].push_back({ntoi[v], d});E[ntoi[v]].push_back({ntoi[u], d});}Dijskra();d = t;while(d) {ans.push_back(d);d = path[d];}cout << iton[0];for (int i = ans.size() - 1; i >= 0; i--) cout << "->" << iton[ans[i]];cout << '\n' << sum[t] << ' ' << Dis[t] << ' ' << Num[t] << '\n';return 0;
}

L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT相关推荐

  1. L3-017 森森快递 (30 分)-PAT 团体程序设计天梯赛 GPLT

    森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号.由于道路限制,第i号城市(i=0,⋯,N−2)与第(i ...

  2. L3-012 水果忍者 (30 分)-PAT 团体程序设计天梯赛 GPLT

    2010年风靡全球的"水果忍者"游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以 ...

  3. L3-021 神坛 (30 分)-PAT 团体程序设计天梯赛 GPLT

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...

  4. L3-020 至多删三个字符 (30 分)-PAT 团体程序设计天梯赛 GPLT

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 106] 内的字符串. ...

  5. L3-016 二叉搜索树的结构 (30 分)-PAT 团体程序设计天梯赛 GPLT

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...

  6. L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT

    正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长城上,建造了许多烽火台.每个烽火台都监视着一个特定的地区范围.一旦某个地区有外敌入侵,值守在对应烽火台上的士兵就会将敌情通报给周围的烽火台,并迅 ...

  7. L3-006 迎风一刀斩 (30 分)-PAT 团体程序设计天梯赛 GPLT

    迎着一面矩形的大旗一刀斩下,如果你的刀够快的话,这笔直一刀可以切出两块多边形的残片.反过来说,如果有人拿着两块残片来吹牛,说这是自己迎风一刀斩落的,你能检查一下这是不是真的吗? 注意摆在你面前的两个多 ...

  8. L3-023 计算图 (30 分)--PAT 团体程序设计天梯赛 GPLT

    "计算图"(computational graph)是现代深度学习系统的基础执行引擎,提供了一种表示任意数学表达式的方法,例如用有向无环图表示的神经网络. 图中的节点表示基本操作或 ...

  9. L3-022 地铁一日游 (30 分)-PAT 团体程序设计天梯赛 GPLT

    森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的最短距离(即计费距离)每 K 公里增加 1 元车费. ...

最新文章

  1. java:输入输出流
  2. AGG第二十课 agg::ellipse 方法approximation_scale()
  3. menisa mysql_实例详细说明linux下去除重复行命令uniq
  4. java/android 做题中整理的碎片小贴士(12)
  5. linux脚本vrrp_script,keepalived 的 vrrp_script
  6. 11位大牛与您共建数智升级路径
  7. Java简单代码-用*号拼三角形
  8. 大学生影视主题网页制作 腾龙电影网页设计模板 学生静态网页作业成品 dreamweaver电影HTML网站制作
  9. Duet Display用一根数据线将iPad变身扩展显示器
  10. c++最大公因数与最小公倍数求法
  11. 2020计算机考研英语国家线,2020考研英语国家分数线?
  12. 80C51单片机:2.初学点亮发光二极管,流水灯案例
  13. 古代地图的那些趣事儿
  14. 【Unity后期渲染】Post Processing 后处理插件最全使用说明
  15. # 驱动安全编码排查指南
  16. 解决:Mac brew Error: Your CLT does not support macOS 11.2
  17. 双击桌面上的IE图标却提示找不到文件iexplore.com的解决办法
  18. 力扣1845——座位预约管理系统(优先队列)
  19. 祝贺| 蚂蚁金服年轻交互设计师陈凯翔,荣获HCII 2018 最佳论文奖
  20. USB Gadget iMX6U LL开发板模拟U盘

热门文章

  1. npm 切换源_nrm:npm包管理工具
  2. Android编程之如何取得View的当前位置
  3. 银行业务调度系统学习
  4. Python中类和对象的概念,面向对象编程
  5. mysql中的union用法以及子查询综合应用
  6. 中国人工智能学会通讯——后深度学习时代的人工智能
  7. 10条建议让你创建更好的jQuery插件(转载)
  8. 过期域名如何助力犯罪分子攻破企业防御
  9. 隐藏十年的 Sudo 漏洞 (CVE-2021-3156) 还影响 macOS 和 IBM IAX
  10. GO SMS Pro App 被曝0day,泄露数百万条媒体消息