tarjan+并查集做法Wa on #13求调
查看原帖
tarjan+并查集做法Wa on #13求调
555056
hsy8116楼主2024/10/21 21:27

tarjan+并查集做法 Wa on #13Wa \ on \ \# 13 求调。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;

const int NR = 5e5 + 10;

struct edge
{
	int nxt, to;
}e[NR * 2];

int head[NR], cnt;

void add(int x, int y)
{
	e[++cnt].nxt = head[x];
	e[cnt].to = y;
	head[x] = cnt;
}

struct Query_sets
{
	int to, id;
};

vector<Query_sets> q[NR];
int f[NR];
int vis[NR];

int find(int x)
{
	if (x != f[x]) f[x] = find(f[x]);
	return f[x];
}

int ans[NR];

void tarjan(int x, int fa)
{
	f[x] = x;
	for (int i = head[x]; i; i = e[i].nxt)
	{
		int y = e[i].to;
		if (y == fa) continue;
		tarjan(y, x);
	}
	for (int i = 0; i < (int)q[x].size(); i ++)
	{
		int y = q[x][i].to;
		if (vis[y])
		{
			ans[q[x][i].id] = find(y);
		}
	}
	vis[x] = 1;
	f[x] = fa;
}

int main()
{
	int n, m, s;
	scanf("%d%d%d", &n, &m, &s);
	for (int i = 1; i < n; i ++)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		add(x, y);
		add(y, x);
	}
	for (int i = 1; i <= m; i ++)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		q[a].push_back((Query_sets){b, i});
		q[b].push_back((Query_sets){a, i});
	}
	tarjan(s, s);
	for (int i = 1; i <= m; i ++)
	{
		printf("%d\n", ans[i]);
	}
	return 0;
}
2024/10/21 21:27
加载中...