Heng_Xin 题解分享 · 2025/4/11
狡兔 k 窟(编程题) - 题解
真坑啊, 原来 $c_i$ 可以 大于 $n$, 之前一直拿 n 开数组, 我说怎么过不去qwq ```cpp #include <iostream> #include <string> #include <vector> #include <unordered_map> #include <unordered_set> #include <queue> using namespace std; using ll = long long; struct Ac { void run() { constexpr int N = 1e5; int n, m; cin >> n >> m; vector<int> zu(N); for (int i = 0; i < n; ++i) { int x; cin >> x; --x; zu[i] = x; } vector<vector<int>> g(N); for (int i = 1; i < n; ++i) { int u, v; cin >> u >> v; --u, --v; u = zu[u]; v = zu[v]; if (u == v) continue; g[u].push_back(v); g[v].push_back(u); } while (m--) { int s, t; cin >> s >> t; --s, --t; int go = zu[s], to = zu[t]; if (go == to) { cout << "0\n"; continue; } vector<int> vis(N); // cnt, now queue<tuple<int, int>> q; vis[go] = 1; q.push(tuple<int, int>{0, go}); while (q.size()) { int cnt, now; tie(cnt, now) = q.front(); q.pop(); ++cnt; for (int it : g[now]) { if (it == to) { cout << cnt << '\n'; goto End; } if (vis[it]) continue; vis[it] = 1; q.push(tuple<int, int>{cnt, it}); } } End: ; } } }; int main() { Ac ak; ak.run(); return 0; } ```
查看全文
0 0 0 3