MnZn求助tarjan
查看原帖
MnZn求助tarjan
428889
Xile楼主2023/11/10 20:19

为什么这样写会wa一个点

#include<bits/stdc++.h>

using namespace std;

const int N=5e5+5;
int n,m,root;

int read(){
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)) c=='-'?(f=-1,c=getchar()):c=getchar();
	while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
void write(int x){
	if(x>9) write(x/10);
	putchar(x%10^48);
}
void print(int x) {x<0?(putchar('-'),write(-x)):write(x);}

struct node{int y,id;};
vector<node> que[N];

struct Edge{int to,next;}edge[N<<1];
int head[N],tot;
void add_edge(int x,int y) {edge[++tot]={y,head[x]};head[x]=tot;}

int fa[N];
int get(int x) {return fa[x]==x?x:fa[x]=get(fa[x]);}

int v[N],ans[N];
void tarjan(int x){
	v[x]=1;
	for(int i=head[x];i;i=edge[i].next){
		int y=edge[i].to;
		if(v[y]) continue;
		tarjan(y);
		fa[y]=get(x);
	}
	for(auto i:que[x]){
		int y=i.y,id=i.id;
		if(v[y]==2) ans[id]=get(y); //如果写成v[y]==1就ac了
	}
	v[x]=2;
}

signed main(){
	n=read(),m=read(),root=read();
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<n;i++){
		int a=read(),b=read();
		add_edge(a,b),add_edge(b,a);
	}
	for(int i=1;i<=m;i++){
		int x=read(),y=read();
		que[x].push_back({y,i});
		que[y].push_back({x,i});
	}
	tarjan(root);
	for(int i=1;i<=m;i++) print(ans[i]),puts("");
	return 0;
}
2023/11/10 20:19
加载中...