wa求助,实在找不出错误,以及为什么所有题解都默认1为根节点
查看原帖
wa求助,实在找不出错误,以及为什么所有题解都默认1为根节点
852650
sunfish楼主2024/5/2 07:13

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;
}
2024/5/2 07:13
加载中...