WA100分
查看原帖
WA100分
297555
Zlc晨鑫楼主2022/9/27 19:44

dalao们帮忙看看

#include <cstdio> 
#include <vector>
#include <cstring>
#include <iostream>

using namespace std;

struct Query
{
	int y, id;
};

const int N = 500010, M = 1000010;

int h[N], e[M], ne[M], idx;

void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

int n, m, root;
vector<Query> ask[N];
int v[N], fa[N];
int ans[N];

int get(int x)
{
	if (x == fa[x]) return x;
	return fa[x] = get(fa[x]);
}

void tarjan(int u)
{
	v[u] = 1;
	
	for (int i = h[u]; ~i; i = ne[i])
	{
		int j = e[i];
		if (v[j]) continue;
		tarjan(j);
		fa[j] = u;
	}
	
	// 由于y可能是x的子树中的点,所以要先递归处理子树再处理询问
	for (int i = 0; i < ask[u].size(); i ++ ) 
	{
		Query t = ask[u][i];
		int y = t.y, id = t.id;
		if (v[y] == 2)
			ans[id] = get(y);
	}
	
	v[u] = 2;
}

int main()
{
	memset(h, -1, sizeof h);
	cin >> n >> m >> root;
	for (int i = 0; i < n - 1; i ++ )
	{
		int a, b;
		scanf("%d%d", &a, &b);
		add(a, b);
		add(b, a);
	}
	
	for (int i = 1; i <= n; i ++ ) fa[i] = i;
	
	for (int i = 1; i <= m; i ++ )
	{
		int x, y;
		scanf("%d%d", &x, &y);
		ask[x].push_back({y, i});
		ask[y].push_back({x, i});
	}
	
	tarjan(root);
	
	for (int i = 1; i <= m; i ++ ) cout << ans[i] << endl;
	
	return 0;
}
2022/9/27 19:44
加载中...