求助,样例能过但是全WA
查看原帖
求助,样例能过但是全WA
1036693
carp_oier楼主2023/9/18 13:01

用的是Tarjan离线做法,感觉很没有问题,求助大佬们。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll

typedef pair<ll, ll> pll;

const ll N = 5e5 + 10, M = N * 2;

ll n, m, root;

ll tot, ne[M], e[M], h[M];

ll p[N], st[N];

ll res[N];

vector<pll> query[N];

inline void add(ll a, ll b)
{
	ne[++tot] = h[a], h[a] = tot, e[tot] = b;
}

inline ll find(ll x)
{
	if(p[x] == x) return x;
	else return p[x] = find(p[x]);
}

inline void tarjan(ll u)
{
	st[u] = 1;
	
	for(rl i=h[u]; ~i; i = ne[i])
	{
		ll v = e[i];
		if(!st[v])
		{
			tarjan(v);
			p[v] = u;
		}
	}
	
	for(auto item : query[u])
	{
		ll y = item.first,  id = item.second;
		if(st[y] == 2);
		{
			ll anc = find(y);
			res[id] = anc;
		}
	}
	
	st[u] = 2;
}

int main()
{
	memset(h, -1, sizeof h);
	
	cin >> n >> m >> root;
	
	for(rl i=1; i < n; ++ i)
	{
		ll a, b;
		cin >> a >> b;
		add(a, b), add(b, a);
	}
	
	for(rl i=1; i <= m; ++ i)
	{
		ll a, b;
		cin >> a >> b;
		if(a != b)
		{
			query[a].push_back({b, i});
			query[b].push_back({a, i});
		}
	}
	
	for(rl i=1; i <= n; ++ i) p[i] = i;
	
	tarjan(root);
	
	for(rl i=1; i <= m; ++ i) cout << res[i] << endl;
	return 0;
}
2023/9/18 13:01
加载中...