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

输入格式:
输入第一行给出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

其实就是普通的单源最短路,但是他的结点是字符串形式,所以我采用了映射来存图和其他的数据,但是代码非常丑陋,如果将it->first全部用个变量先存下会比较好看。
也能用其他方法:字符串映射为整数,因为每个字符串都是3位大写字母,总共才26^3种可能,然后就把结点变成整数了
#include<bits/stdc++.h>
using namespace std;
const int N=205,INF=0x3f3f3f3f;
int n,k,t;
string s,d,str;
unordered_map<string,int> num,dist,dist2,dist3,st,cnt;//距离,节点数,杀敌数
unordered_map<string,string> f;
unordered_map<string,unordered_map<string,int> >mp;
void dijkstra(string u){unordered_map<string,int>::iterator it;for(it=num.begin();it!=num.end();it++){dist[it->first]=INF;dist2[it->first]=0;dist3[it->first]=0;}dist[u]=0;dist2[u]=1;dist3[u]=0;cnt[u]=1;f[u]="-1";for(int i=0;i<n;++i){string t="-1";for(it=num.begin();it!=num.end();it++){if(st[it->first]==0&&(t=="-1"||dist[it->first]<dist[t]))t=it->first;}st[t]=1;for(it=num.begin();it!=num.end();++it){if(mp.find(t)==mp.end())continue;unordered_map<string,unordered_map<string,int> >:: iterator p=mp.find(t);if(p->second.find(it->first)==p->second.end())continue;if(dist[it->first]>dist[t]+mp[t][it->first]){dist[it->first]=dist[t]+mp[t][it->first];dist2[it->first]=dist2[t]+1;dist3[it->first]=dist3[t]+num[it->first];f[it->first]=t;cnt[it->first]=cnt[t];}else if(dist[it->first]==dist[t]+mp[t][it->first]){if(dist2[it->first]<dist2[t]+1){dist2[it->first]=dist2[t]+1;dist3[it->first]=dist3[t]+num[it->first];f[it->first]=t;}else if(dist2[it->first]==dist2[t]+1){if(dist3[it->first]<dist3[t]+num[it->first]){dist3[it->first]=dist3[t]+num[it->first];f[it->first]=t;}}cnt[it->first]+=cnt[t];}}}
}
void dfs(string u){if(u=="-1")return ;dfs(f[u]);if(u!=d)cout<<u<<"->";else cout<<u<<endl;
}
int main(){cin>>n>>k>>s>>d;for(int i=0;i<n-1;++i){cin>>str>>t;num[str]=t;}num[s]=0;while(k--){string x,y;cin>>x>>y>>t;mp[x][y]=mp[y][x]=t;}dijkstra(s);dfs(d);cout<<cnt[d]<<" "<<dist[d]<<" "<<dist3[d];return 0;
}

7-5 直捣黄龙 单源最短路 映射的使用和遍历相关推荐

  1. 【HDU - 2112】 HDU Today(dijkstra单源最短路 + map转换)

    题干: HDU Today Time Limit : 15000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Tota ...

  2. acwing单源最短路的建图模式总结

    .根据边权的范围以及问题求解的需要,最短路问题可以分为以下 4 种情形,分别用不同的算法求解. • 单源最短路径(固定一个顶点为原点,求源点到其他每个顶点 的最短路径) • 1. 边权非负:Dijks ...

  3. 算法提高课-图论-差分约束- AcWing 1169. 糖果:spfa求单源最短路、差分约束

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 差分约束系统 差分约束系统是一种特殊的N元一次不等式组.它包含N个变量X1,...,XnX_1,...,X_nX1​,...,Xn​ ...

  4. CSP认证201609-4 交通规划[C++题解]:最短路径树、dijkstra求单源最短路、递推思想

    题目分析 来源:acwing 分析: 这题是最短路树.保持原图中所有点到根结点的最短距离不变,然后在原图中选择一些边,使所有点连通的最短路是多长. 最短路径树,是一种使用最短路径算法生成的数据结构树. ...

  5. 算法提高课-图论-单源最短路的综合应用-AcWing 1135. 新年好:dijkstra和dfs暴搜结合

    题目分析 来源:acwing 分析: 先预处理出从1,a,b,c,d,e出发到其他所有点的单源最短路.存在二维数组dist[6][N]中 dfs暴搜所有拜访顺序,共有5!种,对于每一种拜访顺序,可以通 ...

  6. 算法提高课-图论-单源最短路的建图方式-AcWing 920. 最优乘车:bfs求最短路、建图

    题目分析 来源:acwing 分析: 本题难在抽象建图上,这里采用的建图方式是:同一条公交线路上,前面的站点都可以连一条有向边到其后面的站点,且边权都为1. 由于边权都是1,可以用bfs来求最短路. ...

  7. PAT甲级1111 Online Map (30分):[C++题解]两次dijkstra求单源最短路、保存路径、长度最短、时间最短

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:dijkstra求单源最短路的题目. 只是写两遍而已,第一遍求按照路径长度求,第二遍按照时间最少求. 另外加一个vector路径的判断 ...

  8. 单源最短路 Dijkstra算法 和 SPFA算法

    单源最短路 •从一个点出发,到达其他顶点的最短路径的长度. •基本操作:松弛 •d[u]+map[u, v]< d[v]这样的边(u,v)称为紧的(tense),可以对它进行松弛(relax): ...

  9. 系兄弟就来砍我 有向图单源最短路

    系兄弟就来砍我 时间限制: 1 Sec  内存限制: 128 MB 题目描述 渣渣灰因为一句"大家好,我系渣渣辉,系兄弟就来砍我"引得众粉丝纷纷拿两米长的大刀寻找. 现有n个据点, ...

最新文章

  1. 删除单链表中的重复节点(c语言版本)
  2. centos6.5_64 java 环境变量配置
  3. Silverlight教程第三部分:使用 Networking取回数据并填充DataGrid
  4. 上传文件到 Web 服务器
  5. 暗黑三使用服务器维护,《暗黑3》本周更新修复内容及维护时间公布
  6. jquery 删除字符串最后一个字符的方法
  7. android 拨打紧急号码,通话时开启免提功能实现
  8. HDU 4117 GRE Words
  9. 八邻域轮廓跟踪算法_结合mRMR选择和IFCM聚类的遥感影像分类算法
  10. [深度学习-实践]tensorflow_hub简单理解模型的生成与加载
  11. Linux学习总结(51)——25个Linux服务器安全小贴士
  12. 在Java中如何读取用MATLAB的fwrite()函数写入文件的数据
  13. python之七行代码制作GIF动画
  14. [转载] python无法从nltk中调取文本 from nltk.book import *
  15. ZIGBEE协议栈如何低功耗(CC2530+ZIGBEE2.5)
  16. uTorrent任务栏的种子状态一直是“找不到元素”
  17. MSOCache是什么?
  18. windows无法连接到某个wifi_Windows无法连接到网络解决方法
  19. java图片降噪_Java基于opencv实现图像数字识别(四)—图像降噪
  20. 微信怎么自动加好友java_iOS逆向开发之微信自动添加好友功能

热门文章

  1. Grafana的版本升级和数据迁移
  2. 赛门铁克召开2010财年中国合作伙伴高峰会
  3. 深度学习论文: LRNnet: a light-weighted network for real-time semantic segmentation及其PyTorch实现
  4. C. Ehab and Path-etic MEXs(思维+构造)
  5. 计算机软件安装注意事项
  6. 笔记:区块链基础(一)
  7. zookeeper客户端使用与集群特性
  8. ajax常用的api测试
  9. win 下光盘刻录方式
  10. 【论文阅读32】《Texture Defragmentation for Photo-Reconstructed 3D Models》