Pagini recente » Cod sursa (job #2313939) | Cod sursa (job #870481) | Cod sursa (job #2551119) | Cod sursa (job #533684) | Cod sursa (job #852715)
Cod sursa(job #852715)
#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';
}