知道大概哪里错误但是不会调
查看原帖
知道大概哪里错误但是不会调
635555
Pol_Pot楼主2023/2/24 21:35

rt,思路是用tarjan算法使用并查集来做,代码如下:

#include<bits/stdc++.h>
using namespace std;

const int N=5e5+10;
int n,m,s,fa[N],ans[N];
vector<pair<int,int>> query[N];
vector<int> e[N];
bool vis[N];

void init(){
	//初始化并查集
	for (int i=1;i<=n+1;i++){
		fa[i]=i;
	}
}
int find(int u){
	//查找并查集   
	
	if (u==fa[u]){
		return u;
	}
	return fa[u]=find(fa[u]);
}

void tarjan(int u){
	//init();
	vis[u]=true;
	for (auto v:e[u]){
		if (!vis[v]){
			//没访问过
			tarjan(v);
			fa[v]=u;
		}
	}
	for (auto q:query[u]){
		int v=q.first;
		int i=q.second;
		if (vis[v]) {
			//-- question --
        //大概是这里,但是我不确定
			ans[i]=find(v);
			//cout<<find(v)<<"    114514"<<endl;
		}
	}
}

int main(){
	init();
	cin>>n>>m>>s;
	for (int i=1;i<=n-1;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		e[a].push_back(b);
		e[b].push_back(a);
	}
	for (int i=1;i<=m;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		query[a].push_back({b,i});
		query[b].push_back({a,i});
	}
	tarjan(s);
	for (int i=1;i<=m;i++){
		cout<<ans[i]<<endl;
	}
	return 0;
}
2023/2/24 21:35
加载中...