bsoj 2701 tarjan求lca

還是很水的題。。。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAX 200005
#define rep(i,j,k) for(int i=j;i<=k;i++)

using namespace std;

int n,k,to[2*MAX],next[2*MAX],head[MAX],ask_to[2*MAX],ask_next[2*MAX],ask_head[MAX];
int tot=0,Tot=0,deep[MAX];
int num[MAX],father[MAX],ans[MAX],done[MAX],mark[MAX],root,m;

void add(int from,int To)
{
	to[++tot]=To;
	next[tot]=head[from];
	head[from]=tot;
}

void add_ask(int from,int To,int Num)
{
	ask_to[++Tot]=To;
	num[Tot]=Num;
	ask_next[Tot]=ask_head[from];
	ask_head[from]=Tot;
}

int getfather(int x)
{
	if(father[x]==x)
		return x;
	father[x]=getfather(father[x]);
	return father[x];
}

void tarjan(int x)
{
	done[x]=1;
	father[x]=x;
	for(int i=head[x];i;i=next[i])
	{
		int y=to[i];
		if(!done[y])
		{
			tarjan(y);
			father[y]=x;
		}
	}
	mark[x]=1;
	for(int i=ask_head[x];i;i=ask_next[i])
	{
		int y=ask_to[i];
		if(mark[y])
			ans[num[i]]=getfather(y);
	}
}

void dfs(int x,int dep)
{
	done[x]=1;
	deep[x]=dep;
	for(int j=head[x];j;j=next[j])
		if(!done[to[j]])
			dfs(to[j],dep+1);
}

int main()
{
	scanf("%d",&n);
	rep(i,1,n)
	{
		int op,a1,a2;
		scanf("%d",&op);
		while(op--)
		{
			scanf("%d",&a2);
			add(i,a2);
			//add(a2,i);
			father[a2]=i;
		}
	}
	scanf("%d",&m);
	rep(i,1,m)
	{
		int a1,a2;
		scanf("%d%d",&a1,&a2);
		add_ask(a1,a2,i);
		add_ask(a2,a1,i);
	}

	root=1;
	while(father[root])
		root=father[root];
	tarjan(root);
	memset(done,0,sizeof(done));
	dfs(root,1);
	rep(i,1,m)
		printf("%d\n",deep[ans[i]]);
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章