Pagini recente » Cod sursa (job #474278) | Cod sursa (job #1326447) | Cod sursa (job #1922545) | Cod sursa (job #1621487) | Cod sursa (job #393920)
Cod sursa(job #393920)
#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;
}