tarjan lca,搓了好多样例都没看出来错误,调了三个小时了
题解全部默认1为根节点,但题面似乎并没有提及?
希望佬能提供个hack或者帮我看一下哪里有错误,跪谢
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<cmath>
#include<vector>
using namespace std;
int n,m,s,x,y,tot=0,vtot=0;
const int N=500005,M=1000005;
int head[N],to[M],nxt[M];
int vhead[N],vto[M],vnxt[M];//开两张图
int fa[N],lca[2*M];
bool visit[N];
void add(int x,int y){
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
return ;
}
void vadd(int x,int y){
vto[++vtot]=y;
vnxt[vtot]=vhead[x];
vhead[x]=vtot;
return ;
}
int find(int u){
if(u!=fa[u]) fa[u]=find(fa[u]);
return fa[u];
}
void tarjan(int u){
visit[u]=true;
for(int i=head[u];i!=-1;i=nxt[i]){
int v=to[i];
if(visit[v]) continue;
tarjan(v);
fa[v]=u;
}
for(int i=vhead[u];i!=-1;i=vnxt[i]){
int v=vto[i];
if(visit[v]){
lca[i]=find(v);
if(i%2)
lca[i+1]=lca[i];
else
lca[i-1]=lca[i];
}
}
return ;
}
int in[N];
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
for(int tt=1;tt<=t;tt++){
cin>>n;
tot=0;vtot=0;
for(int i=1;i<=n;i++){
fa[i]=i;head[i]=-1;vhead[i]=-1;visit[i]=0;
}
for(int i=1;i<=n;i++){
int num;
cin>>num;
while(num--){
int v;cin>>v;
add(i,v);add(v,i);
in[v]++;
}
}
cin>>m;
for(int i=1;i<=m;i++){
cin>>x>>y;
vadd(x,y);
vadd(y,x);
}
for(int i=1;i<=n;i++){
if(in[i]==0){
cout<<i<<endl;
tarjan(i);
break;
}
}
printf("Case %d:\n",tt);
for(int i=1;i<=m;i++)
cout<<lca[i*2]<<endl;
for(int i=1;i<=2*m;i++){
lca[i]=0;
}
}
return 0;
}