刚才发错了发的倍增现在重发 Tarjan+并查集为什么最后两个点TLE?
查看原帖
刚才发错了发的倍增现在重发 Tarjan+并查集为什么最后两个点TLE?
1053112
LinearXeno楼主2024/11/3 10:16
#include<bits/stdc++.h>
using namespace std;
int n,m,ut,vt,root,fa[500010];
vector<int> g[500010];
bool vis[500010];
vector<pair<int,int> > ask[500010];
int ans[500010];
void init() {
	for (int i = 1;i <= n;i ++)
		fa[i] = i;
	return;
}
int find(int x) { 
	while (fa[fa[x]] != fa[x]) fa[x] = fa[fa[x]];
	return fa[x];
}
void unionn(int x,int y) {
	fa[find(y)] = find(x);
	return;
}
void tarjan(int u) {
	vis[u] = true;//
	for (int i = 0;i < g[u].size();i ++) {
		int v = g[u][i];
		if (!vis[v]) {
			tarjan(v);
			unionn(u,v);
		}
	}
	for (int i = 0;i < ask[u].size();i ++) {
		int v = ask[u][i].first;
		if (vis[v]) ans[ask[u][i].second] = find(v);
	}
	return;
}
int main() {
	scanf("%d%d%d",&n,&m,&root);
	for (int i = 1;i <= n - 1;i ++) {
		scanf("%d%d",&ut,&vt);
		g[ut].push_back(vt);
		g[vt].push_back(ut);
	}
	for (int i = 1;i <= m;i ++) {
		scanf("%d%d",&ut,&vt);
		ask[ut].push_back(make_pair(vt,i));
		ask[vt].push_back(make_pair(ut,i));
	}
	init();
	tarjan(root);
	for (int i = 1;i <= m;i ++)
		printf("%d\n",ans[i]);
	return 0;
}

2024/11/3 10:16
加载中...