Cod sursa(job #1651041)

Utilizator ErikHEErik Henning ErikHE Data 11 martie 2016 23:47:14
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream f("memo.in");
ofstream g("memo.out");

int arbt[1001], niv[1001], n;

void calc_nivel(int nv)  {
    if (niv[arbt[nv]] == 0)
        calc_nivel(arbt[nv]);
    niv[nv] = 1 + niv[arbt[nv]];
}

int lca(int a, int b)   {
int c, nivc;
while (niv[a] != niv[b])   {
    if (niv[a]>niv[b])
        a = arbt[a];
    else
        b = arbt[b];
}
while (arbt[a] != arbt[b])  {
    a = arbt[a];
    b = arbt[b];
}
c = arbt[a];
return c;
}

bool ramura(int a, int b)   {
int c, ok=1;
if (niv[a]>niv[b])  {
while (arbt[a]!=0 && ok==1)   {
if (arbt[a] == b)
    ok = 0;
a = arbt[a];
}
}
else
    while (arbt[b]!=0 && ok==1)   {
        if (arbt[b] == a)
            ok = 0;
        b = arbt[b];
}


if (ok==1)
    return false;
else
    return true;
}
int main()
{
    int i, x, y, m, j, rad;
    f>>n;
    for (i=1;i<=n;i++)  {
        f>>arbt[i];
        if (arbt[i]==0)
            rad = i;
    }
    f>>m;
    niv[rad]=1;
    for (i=1;i<=n;i++)  {
        if (niv[i]==0)//optimizare
        calc_nivel(i);
    }
    int dist;
    for (i=1;i<=m;i++)  {
        f>>x>>y;
        if (ramura(x,y) == true)
            dist = niv[x] - niv[y];
        else
        dist = niv[x] + niv[y] - 2*niv[lca(x,y)];
        cout<<lca(x,y)<<" "<<dist<<endl;

    }



    return 0;
}