重返天梯-L3-011 直捣黄龙 (30 分)(dijkstra)

本文通过一道编程题介绍了如何使用Dijkstra算法求解最短路径问题,并在路径不唯一时根据特定条件(解放城镇数量、消灭敌军人数)进行路径优化。代码实现采用C++,并提供了详细的解题思路和路径回溯方法。

题目解析

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

写这道题之前,可以也写一写L2-001 紧急救援 (25 分),都是比较基础的最短路径问题。不过这两道题除了要算出最短路径外,还要额外地输出一些参数。现在逐一对这些参数进行分析。

  1. 最短路径条数。当要更新距离时,num[j] = num[t];当距离相同时,num[j] += num[t]
  2. 最短路径经过了哪些点。path[j] = t。记录前一个结点,最后倒序输出
  3. 经过了多少个点,所经过的点中权重最大。w[j] = w[t] + 1或者a[j]

C++

#include <iostream>
#include <cstring>
#include <map>
using namespace std;
const int N = 210;
int n, k;
string sta, ed;
map<string, int> m; // 名称转编号
map<int, string> mis; // 编号转名称
int enemy[N]; 
int g[N][N];
int dist[N], num[N]; // 最短距离,最短路径条数
int w[N]; // 记录到当前点消灭了多少敌军
int city[N]; // 记录已经解放的城镇数
bool st[N]; // 标记最短路径已访问
int path[N]; // 记录前驱结点

void PrintPath(int v) {
   
   
    if (v == 1) {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeSlogan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值