返回题解分享
讨论 / 题解分享/ 帖子详情

狡兔 k 窟(编程题) - 题解

真坑啊, 原来 $c_i$ 可以 大于 $n$, 之前一直拿 n 开数组, 我说怎么过不去qwq

#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 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!