tarjan 在某些数据中会输出0
查看原帖
tarjan 在某些数据中会输出0
164840
zhaowangji楼主2021/1/24 21:56
#include<bits/stdc++.h>
using namespace std;
int Read();
void add_edge(int u,int v);
int n,m,s;
struct Edge{
	int nxt;
	int to;
}e[1000007];
int h[500007],e_cnt;
int fa[500007];
int vis[500007];
vector<int> f_cnt[500007];//查询关系,每个点的
map<pair<int,int>,int> jud;//存储答案
vector<pair<int,int> > ans;//查询关系(题目中的)
int fi(int x){
	if(x!=fa[x])fa[x]=fi(fa[x]);
	return fa[x];
}
void hb(int x,int y){
	fa[y]=x;
	return;
}
void tarjan(int id){
	vis[id]=1;
	for(int i=h[id];i;i=e[i].nxt){
		int to=e[i].to;
		if(vis[to])continue;
		tarjan(to);
		hb(id,to);
	}
	for(int i=0;i<f_cnt[id].size();++i){
		int y=f_cnt[id][i];
		if(vis[y]){
			jud[make_pair(id,y)]=jud[make_pair(y,id)]=fi(y);
		}
	}
	return;
}
int main(){
	n=Read();m=Read();s=Read();
	for(int i=1;i<n;++i){
		int x=Read(),y=Read();
		add_edge(x,y);
		add_edge(y,x);
	}
	for(int i=1;i<=m;++i){
		int a=Read(),b=Read();
		f_cnt[a].push_back(b);
		f_cnt[b].push_back(a);
		ans.push_back(make_pair(a,b));
	}
	for(int i=1;i<=n;++i)fa[i]=i;
	tarjan(s);
	for(int i=0;i<ans.size();++i){
		printf("%d\n",jud[ans[i]]);
	}
	return 0;
}
void add_edge(int u,int v){
	e[e_cnt].to=v;
	e[e_cnt].nxt=h[u];
	h[u]=e_cnt++;
	return;
}
int Read(){
	char ch=getchar();
	int flag=1,res=0;
	while(ch<'0'||ch>'9'){
		if(ch=='-')flag=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		res=(res<<1)+(res<<3)+ch-'0';
		ch=getchar();
	}
	return flag*res;
}
2021/1/24 21:56
加载中...