Cod sursa(job #852715)

Utilizator danalex97Dan H Alexandru danalex97 Data 11 ianuarie 2013 17:30:01
Problema Felinare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
using namespace std;

ifstream F("tree.in");
ofstream G("tree.out");

const int Nmax = 200010;
const int oo = 1<<30;

struct edge
{
    int nod;
    edge* next;
    edge()
    {
        nod = 0;
        next = NULL;
    }
};

edge* A[Nmax];

void push_edge(edge*& Nod,int Val)
{
    edge* Q = new edge;
    Q -> next = Nod;
    Q -> nod = Val;
    Nod = Q;
}

int N,Rad;
int D[4][Nmax];

void Get( int Nod )
{
    if ( A[Nod]->next == NULL )
    {
        D[0][Nod] = D[1][Nod] = D[2][Nod] = D[3][Nod] = 1;
        return;
    }
    int Min1 = 0 , Min2 = 0;
    D[1][Nod] = D[0][Nod] = 0;
    D[3][Nod] = 1;
    for (edge* it=A[Nod]; it->next != NULL ;it=it->next)
    {
        Get( it->nod );
        D[0][Nod] += D[2][it->nod];
        D[1][Nod] += D[2][it->nod];
        D[3][Nod] += D[2][it->nod];
        if ( D[2][it->nod] - D[0][it->nod] >= D[2][Min2] - D[0][Min2] ) Min2 = it->nod;
        if ( D[2][Min1] - D[0][Min1] <= D[2][Min2] - D[0][Min2] ) swap( Min1 , Min2 );
    }

    if ( Min2 == 0 )
    {
        D[0][Nod] = D[0][Min1];
        D[3][Nod] = 1 + D[2][Min1];
        D[1][Nod] = D[0][Nod] = min( D[3][Nod] , D[0][Nod] );
        D[2][Nod] = min( D[1][Nod] , D[0][Nod] );
    }
    else
    {
        D[0][Nod] += D[0][Min1] - D[2][Min1];
        D[1][Nod] += D[0][Min1] - D[2][Min1] + D[0][Min2] - D[2][Min2] - 1;
        D[0][Nod] = min( D[3][Nod] , D[0][Nod] );
        D[2][Nod] = min( D[1][Nod] , D[0][Nod] );
    }

}

int main()
{
    F>>N;
    for (int i=1;i<=N;++i)
        A[i]=new edge;
    for (int i=1,a;i<=N;++i)
    {
        F>>a;
        if ( a != 0 )
            push_edge( A[a] , i );
        else
            Rad = i;
    }

    D[0][0] = oo;
    Get( Rad );

    G<<2*D[2][Rad]-1<<'\n';
}