Tarjan求调 70pts (玄关)
查看原帖
Tarjan求调 70pts (玄关)
564696
MSX78楼主2024/10/6 10:45

测试点下载之后跑了半天然后爆栈了,为什么啊?

#include <bits/stdc++.h>
using namespace std;
int n, m, s;
bool vis[500005];
int fa[500005];
int lca[5000005];
vector<int> v[500005];
vector< pair<int,int> > ck;

int find(int p){
	if(fa[p]==p){
		return p;
	}
	else{
		return fa[p]=find(fa[p]);
	}
}

void tarjan(int pos){
	fa[pos] = pos;
	vis[pos] = 1;
	for(int p:v[pos]){
		if(!vis[p]){
			tarjan(p);
			fa[p] = pos;
		}
	}
	for(int i = 0;i < ck.size();i++){
		if(ck[i].first==pos&&vis[ck[i].second]){
			lca[i/2] = find(ck[i].second);
		}
	}
	
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i = 1;i < n;i++){
		int a, b;
	    scanf("%d%d",&a,&b);
		v[a].push_back(b);
		v[b].push_back(a);
	}
	for(int i = 1;i <= m;i++){
		int a, b;
		scanf("%d%d",&a,&b);
		ck.push_back(make_pair(a,b));
		ck.push_back(make_pair(b,a));
	}
	tarjan(s);
	for(int i = 0;i < m;i++){
		printf("%d\n",lca[i]);
	}
	return 0;
}
2024/10/6 10:45
加载中...