1. 项目背景与题目解析
最近在准备信息学奥赛的同学们肯定对CSP-J/S的真题不陌生,今天我要分享的是2019年江西赛区两道关于道路拆除的题目P5627和P5683的解题思路。这两道题都属于图论中的最短路径问题,但考察的角度和解题方法各有特色。
P5627题目大意是给定一个n个节点m条边的无向图,要求选择若干条边拆除,使得从节点1到节点n的最短路径长度恰好增加k。而P5683则是给定一个树结构,要求拆除若干条边使得特定节点对之间的路径长度增加。这两道题都考察了选手对图论基础算法的掌握程度和灵活应用能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 P5627问题核心思路
这道题的关键在于理解"最短路径长度恰好增加k"的含义。我们需要找到一种边拆除方案,使得:
- 原图中1到n的最短路径长度为d
- 拆除某些边后,新的最短路径长度为d+k
- 不能有其他路径的长度小于d+k
我的解题思路是:
- 先用Dijkstra算法计算原图中的最短路径
- 构建最短路径图(包含所有可能的最短路径)
- 在这个子图上寻找合适的边进行拆除
2.2 P5683问题核心思路
这道题是在树结构上操作,相对简单一些。树的性质决定了任意两点间有且只有一条路径。题目要求拆除若干边使得特定点对间的距离增加。
解题步骤:
- 预处理所有节点对的路径
- 对于目标点对,找出其路径上的所有边
- 选择拆除这些边中的若干条,计算拆除后的距离变化
3. 具体实现与代码解析
3.1 P5627的C++实现
cpp复制#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 1005;
const int MAXM = 10005;
struct Edge {
int to, next, w;
} edge[MAXM];
int head[MAXN], dist[MAXN], cnt;
bool vis[MAXN];
void addEdge(int u, int v, int w) {
edge[++cnt].to = v;
edge[cnt].w = w;
edge[cn
