社区讨论
tarjan 在某些数据中会输出0
P3379【模板】最近公共祖先(LCA)参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @locpf4m2
- 此快照首次捕获于
- 2023/10/30 17:35 2 年前
- 此快照最后确认于
- 2023/11/05 04:26 2 年前
CPP
#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;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...