1 条题解
-
2
【解题思路】:发现不管通过什么方式换,最终因为价值不同而花费的金币数都是固定的,即 v[b]-v[a],a 为持有的商品,b 为希望获得商品,唯一的区别是每次交易都要额外支付 1 块钱,所以需要最小化交易次数,我们把每件商品看作 1 个点,如果某件商品 x 能够换为某件商品 y,则让 x 和 y 连一条边,我们的目标是从商品 a 出发尽快到达商品 b,即经过的边的数量尽量少,可以通过 bfs 求经过的最少的边数,设这个值为 min_dist[dst],那么最终答案为min_dist[dst]+v[b]-v[a]。
【参考程序】:
#include <bits/stdc++.h> using namespace std; int n; vector<int> edge[100010]; int val[100010]; int min_dist[100010]; int que[100010], qh, qt; void bfs(int src) { qh = qt = 0; memset(min_dist, 127, sizeof(min_dist)); que[++qt] = src; min_dist[src] = 0; while (qh < qt) { int u = que[++qh]; for (auto v : edge[u]) { if (min_dist[u] + 1 < min_dist[v]) { min_dist[v] = min_dist[u] + 1; que[++qt] = v; } } } } int main() { int m, src, dst; cin >> n >> m >> src >> dst; for (int i = 0; i < n; ++i) { cin >> val[i]; } for (int i = 0; i < m; ++i) { int x, y; cin >> x >> y; edge[x].push_back(y); } bfs(src); if (min_dist[dst] > n) { cout << "No solution\n"; } else { cout << min_dist[dst] - val[src] + val[dst] << "\n"; } return 0; }
- 1
信息
- ID
- 581
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 21
- 已通过
- 10
- 上传者