Cod sursa(job #393920)

Utilizator mihaimoldovanMihai Moldovan mihaimoldovan Data 10 februarie 2010 10:36:40
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<fstream>
#include<iostream>
using namespace std;
#define nn 100005
int n,m,coada[nn],grad[nn],t[nn];
struct nod{
	int info;
	nod *next;
};
nod *g[nn],*q;
void adauga(int a,int b)
{
	q=new nod;
	q->info=b;
	q->next=g[a];
	g[a]=q;
}
void euler(int i)
{
	coada[++m]=i;
	if(g[i])
	for(nod *p=g[i]; p ; p=p->next)
	{
		euler(p->info);
		coada[++m]=i;
	}
}
int cauta(int a,int b)
{
	int i,j;
	for(i=1;i<=m;++i)
		if(coada[i]==a)
			break;
	for(j=1;j<=m;++j)
		if(coada[j]==b)
			break;
	if(j<i)
	{
		int aux=i;
		i=j;
		j=aux;
	}
	int min=coada[i];
	for(++i;i<=j;++i)
	{
		if(grad[coada[i]]<grad[min])
			min=coada[i];
	}
	return min;
}
int main()
{
	int i,a,b,d;
	ifstream fin("lca.in");
	fin>>n>>d;
	t[1]=0;
	for(i=2;i<=n;++i)
	{
		fin>>t[i];
		adauga(t[i],i);
	}
	for(i=2;i<=n;++i)
	{
		int d=0,x=t[i];
		while(x)
		{
			++d;
			x=t[x];
		}	
		grad[i]=d;
	}
	euler(1);
	for(i=1;i<=m;++i)
		cout<<coada[i]<<" ";
	FILE *f=fopen("lca.out","w");
	for(;d;--d)
	{
		fin>>a>>b;
		fprintf(f,"%d\n",cauta(a,b));
	}
	fin.close();
	fclose(f);
	return 0;
}