我们有 N 种商品,每种商品有一个价值 vi。M 个商人各自提供一次单向交换机会:可以用手中的第 xj 种商品交换商人手上的第 yj 种商品。每次交换的规则如下:
现在你初始拥有商品 a,目标是获得商品 b,求最少花费(可以是负数,表示赚钱)。
我们可以把每次交换的花费统一表示。从商品 u 交换到商品 v 时:
这个公式非常简洁,与 vu 和 vv 的大小关系无关。
现在,我们要从商品 a 出发,经过一系列中间商品 c1,c2,…,ck,最终到达 b,即路径:
总花费为:
神奇的事情发生了:所有中间商品的价值全部抵消,总花费只与经过的商人数(边数)以及起点和终点的价值有关。因此,要最小化总花费,我们只需要最小化从 a 到 b 的最少交换次数(即图上的最短路径长度)。
将问题转化为图论模型:
那么,从 a 到 b 的最小花费 =dist(a,b)+vb−va,其中 dist(a,b) 是 a 到 b 的最短路径长度(如果不可达则无解)。
因为每条边权都是 1,我们可以使用**广度优先搜索(BFS)**来求最短路,时间复杂度 O(N+M)。
最后判断:如果 BFS 结束后 b 的距离仍为初始化的无穷大,说明无法到达,输出 No solution;否则输出 dist[b]+vb−va。
vector<int> edge[N],对每个商人 (x,y),执行 edge[x].push_back(y)。dist 为 −1 或一个很大的数(表示未访问),将起点 a 的距离设为 0,入队。No solution;long long 即可)。下面是基于上述思路的 C++ 实现(参考代码的精简版,并添加了注释):
cpp1#include <iostream> 2#include <vector> 3#include <queue> 4#include <cstring> // memset 5using namespace std; 6 7const int MAXN = 100010; 8int n, m, a, b; 9long long val[MAXN]; // 商品价值 10vector<int> edge[MAXN]; // 邻接表 11int dist[MAXN]; // 最短距离(边数) 12 13void bfs(int start) { 14 memset(dist, -1, sizeof(dist)); // -1 表示未访问 15 queue<int> q; 16 q.push(start); 17 dist[start] = 0; 18 while (!q.empty()) { 19 int u = q.front(); q.pop(); 20 for (int v : edge[u]) { 21 if (dist[v] == -1) { // 未访问过 22 dist[v] = dist[u] + 1; 23 q.push(v); 24 } 25 } 26 } 27} 28 29int main() { 30 ios::sync_with_stdio(false); 31 cin.tie(nullptr); 32 33 cin >> n >> m >> a >> b; 34 for (int i = 0; i < n; ++i) cin >> val[i]; 35 for (int i = 0; i < m; ++i) { 36 int x, y; 37 cin >> x >> y; 38 edge[x].push_back(y); // 单向边 39 } 40 41 bfs(a); 42 43 if (dist[b] == -1) { 44 cout << "No solution\n"; 45 } else { 46 // 总花费 = 边数 + v_b - v_a 47 // 注意 val 是 long long 防止运算溢出 48 long long ans = dist[b] + val[b] - val[a]; 49 cout << ans << '\n'; 50 } 51 return 0; 52}
memset(dist, -1, sizeof(dist)) 初始化距离数组,既清晰又能方便判断未访问。queue<int> 进行层序遍历,保证首次访问的路径一定是最短的。val 与答案 ans 使用 long long,因为商品价值最高可达 109,路径长度最大为 105,运算结果可能超出 int 范围(尽管题目输出看似 int 能存,但安全起见用 long long)。ios::sync_with_stdio(false))可以应对百万级别的输入。本题的关键在于推导出每次交换花费的统一公式 1+vv−vu,从而将问题转化为求 a 到 b 的最少交换次数。一旦抓住这一点,剩下的就是简单的 BFS 求无权图最短路。类似的问题在竞赛中常以「等价转换」的形式出现,需要选手细心分析花费的构成。