TarjanRE求助
查看原帖
TarjanRE求助
220824
yyz1005楼主2022/5/10 18:04

tarjan 算法,样例过了,但是全部 RE。

#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
const int M = 1000010;
int n,m,s;
struct qes{
	int fri,nob;//quest[i]中有 "j,v" 表示第v个问题是求i和j的lca 
};
vector<qes> quest[N];
int fa[N];
bool vis[N];
//链式前向星 
struct Edge{
	int from;
	int to;
	int next;
} edge[N*2];
int head[N],cnt = 0;
void add(int u,int v){
	cnt++;
	edge[cnt].from = u;
	edge[cnt].to = v;
	edge[cnt].next = head[u];
	head[u] = cnt;
}
//初始化 
void init(){
	for(int i = 1; i <= n; i++){
		fa[i] = i;
		vis[i] = false;
	}
}
//主体部分
int findfather(int x){//找父亲
	if(fa[x]!=x){fa[x] = findfather(fa[x]);return fa[x];}//找父亲 
	return x;
}
int answer[M];
void dfs(int id,int fath){
	for(int i = head[id]; i; i = edge[i].next){
		if(edge[i].to==fath) continue;
		dfs(edge[i].to,id);
		fa[edge[i].to] = id;
	}
	for(int i = 0; i <= quest[id].size()-1; i++){
		if(vis[quest[id][i].fri]){
			answer[quest[id][i].nob] = findfather(quest[id][i].fri);
		}
	}
	vis[id] = true;
} 
//主函数 
int main(){
	scanf("%d%d%d",&n,&m,&s);
	init();
	for(int i = 1; i < n; i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	for(int i = 1; i <= m; i++){
		int u,v;
		scanf("%d%d",&u,&v);
		if(u==v) answer[i] = u;
		else {
			quest[u].push_back((qes){v,i});
			quest[v].push_back((qes){u,i});
		}
	}
	dfs(s,s);
	for(int i = 1; i <= m; i++) printf("%d\n",answer[i]);
	return 0;
}
2022/5/10 18:04
加载中...