题目解析
重返天梯-L3-011 直捣黄龙 (30 分)(dijkstra)原题链接
本题是一部战争大片 —— 你需要从己方大本营出发,一路攻城略地杀到敌方大本营。首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营。当这样的路径不唯一时,要求选择可以沿途解放最多城镇的路径。若这样的路径也不唯一,则选择可以有效杀伤最多敌军的路径。
写这道题之前,可以也写一写L2-001 紧急救援 (25 分),都是比较基础的最短路径问题。不过这两道题除了要算出最短路径外,还要额外地输出一些参数。现在逐一对这些参数进行分析。
- 最短路径条数。当要更新距离时,num[j] = num[t];当距离相同时,num[j] += num[t]
- 最短路径经过了哪些点。path[j] = t。记录前一个结点,最后倒序输出
- 经过了多少个点,所经过的点中权重最大。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) {

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

被折叠的 条评论
为什么被折叠?



