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

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

解题思路:
较复杂的题,需要用较多知识点,步骤如下:
1、用map将字符串转为数字下标(这样方便)
2、正常的Dijkstra算法
3、3个优先选择的运用
4、递归打印路径

大致的解析在代码里标注了,看不懂可以留言噢,如果对您有帮助就点个赞吧!

代码:

#include<iostream>
#include<string>
#include<map>
#define INT 0x3f3f3f3f
using namespace std;
map<string,int>a;//用整型变量代替字符串,方便建立邻接矩阵
map<int,string>b;//打印路径需要转回字符串
int dis[210];//记录路径的数组
void prin(int c)//打印路径
{if(c==0){cout<<b[c];return;}prin(dis[c]);cout<<"->"<<b[c];
}
int main()
{int c[210][210],d[210],e,f,g,h,l,o,p,ans[210],vis[210]={0},n[210]={0},sum[210]={0},m[210];//c[][]记录路径的时间,d[]记录起点到每个点的最短时间,ans[]记录每个地方的敌人数。//vis[]标记数组,n[]记录结点个数,sum[]记录消灭敌人总数,m[]记录最短时间路径数string i,j,k;for(g=0;g<210;g++)//变量初始化for(h=0;h<210;h++){c[g][h]=INT;d[h]=INT;m[h]=1;}cin>>e>>f;cin>>i>>j;//起点和终点a[i]=0;//设起点为字符串对应0b[0]=i;sum[0]=ans[0];for(g=1;g<e;g++)//每个地方都用数字代替{cin>>k>>l;a[k]=g;b[g]=k;//需要记录号数对应的字符串ans[a[k]]=l;}while(f--){cin>>i>>k>>l;c[a[i]][a[k]]=c[a[k]][a[i]]=l;}d[0]=0;for(f=0;f<e;f++)//下面就是正常Dijkstra算法了{g=-1;h=INT;for(l=0;l<e;l++){if(!vis[l]&&h>d[l]){h=d[l];g=l;}}if(g==-1)break;vis[g]=1;for(l=0;l<e;l++){if(!vis[l]&&d[l]>d[g]+c[g][l]){m[l]=m[g];//路径数d[l]=d[g]+c[g][l];//时间n[l]=n[g]+1;//结点数sum[l]=sum[g]+ans[l];//消灭的敌人数dis[l]=g;//记录路径}else if(!vis[l]&&d[l]==d[g]+c[g][l])//下面就是优先选择了{m[l]=m[g]+m[l];if(n[l]<n[g]+1){n[l]=n[g]+1;sum[l]=sum[g]+ans[l];dis[l]=g;}else if(n[l]==n[g]+1&&sum[l]<sum[g]+ans[l]){sum[l]=sum[g]+ans[l];dis[l]=g;}}}}prin(a[j]);//递归打印路径cout<<endl;cout<<m[a[j]]<<' '<<d[a[j]]<<' '<<sum[a[j]]<<endl;//输出结果
}

基础实验8-1.2 直捣黄龙 (Dijkstra算法)相关推荐

  1. 基础实验8-1.2:直捣黄龙

    代码参考了博文 题目描述 本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要 ...

  2. dijkstra算法原理_这 10 大基础算法,程序员必知必会!

    来源:博客园原文地址:http://kb.cnblogs.com/page/210687/算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序n个项目要Ο(nlogn)次 ...

  3. Dijkstra算法基础

    基本原理 Dijkstra算法是根据贪心算法实现的,首先找出当前点到所有能到达的点之间最短的距离,然后松弛一次继续循环.所谓松弛一次,就是在已经访问过的点中遍历一遍,看看有没有更近的,如果有更近的就更 ...

  4. c语言单源最短路径问题实验报告,单源最短路径问题Dijkstra算法的c语言实现

    求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值 ...

  5. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

  6. 【路径规划】Dijkstra算法——超详细原理图解

    Dijkstra算法详解 1. Dijkstra算法原理  1.1. 有向图的Dijkstra算法  1.2. 无向图和栅格网络的拓展   1.2.1. 无向图   1.2.2. 栅格网络 2. Di ...

  7. 一步一步深入理解Dijkstra算法

    先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...

  8. 你必须会的--Dijkstra算法--单源最短路径问题

    文章目录 一.算法原理 1.基本原理 2.如何保存最短路径? 二.算法实战一 1.测试 2.结果 二.算法实战2 Input Output Sample Input Sample Output 一.算 ...

  9. 通信网络基础期末复习-第五章-路由算法

    写在前面:本文主要依据为<通信网络基础>李建东,盛敏编著,如有侵权,请联系作者删除.本文仅用于个人期末复习与知识结构的搭建. 文章目录 第五章 路由算法 5.1 路由算法概述 5.1.1路 ...

最新文章

  1. 最新 MSDN Library for Visual Studio 2008 SP1
  2. iPhone Safari下iframe不显示滚动条无法滚动的解决方法
  3. 【2012百度之星/初赛上】D:轮子上的度度熊
  4. SECD machine
  5. irrlicht v1.6 例程18 Splitscreen
  6. coursera 《现代操作系统》 -- 第五周 同步机制(1)
  7. Sqlserver内存管理:限制最大占用内存(转载)
  8. [ZJOI2007]时态同步 树形DP
  9. 微信开发之网页授权获取用户基本信息
  10. 手把手带你了解安卓Unity3D手游
  11. 计算机思维与计算文化,计算文化与计算思维基础
  12. SCDN的抗CC攻击和抗DDoS攻击防护是什么?
  13. SecureCRT 经典配色方案
  14. SPSS-非参数检验
  15. 《黄帝内经.生气通天论篇》不生病的智慧节选02
  16. 大数据 客户标签体系_大数据标签体系建立
  17. 简易的监控mysql_使用开源工具mysqlreport监控Mysql数据库-简易使用方法
  18. 软考证书三大含金量,你了解吗?
  19. 【原型模式】原型模式深入分析
  20. 代码实现-CVPR2020-Dynamic Convolution: Attention over Convolution Kernels

热门文章

  1. 麦本本小麦5笔记本U盘装win10系统详细操作
  2. 程序的世界里,短暂的放空
  3. day18-java
  4. 渲染(render)和着色(shading)
  5. python判断数字位数_python求数字位数的方法
  6. Python线上培训机构推荐|如何选靠谱Python培训机构?
  7. Competition4_t3
  8. 论文阅读笔记:(2022) Delving into the Devils of Bird‘s-eye-view Perception: A Review, Evaluation and Recipe
  9. 如何解决MySQL无法打开之——错误2013:lose connection to MySQL blablabla
  10. SpringBoot 多数据源