Drzewo - wyznaczenie wielkości poddrzewa - wersja bez DFS
-
#include<iostream>
-
#include<stack>
-
using namespace std;
-
-
stack <int> W;
-
int LO[50]; //lista ojcow
-
int IS[50]; //ilosc synow
-
int WPD[50]; //wielkosc poddrzewa
-
-
void PDD (int);
-
-
int main()
-
{
-
int n;
-
cin>>n; //ilosc wierzcholkow
-
/* wczytanie listy ojcow BEGIN */
-
for ( int i=1 ; i<=n ; i++ )
-
cin>>LO[i];
-
-
/* zliczanie ilosci synow BEGIN */
-
for ( int i=1 ; i<=n ; i++ )
-
IS[LO[i]]++;
-
-
/* umieszczamy liscie na stosie BEGIN */
-
for ( int i=1 ; i<=n ; i++ )
-
if (IS[i]==0)
-
W.push(i);
-
-
/* Dla wierzcholkow lezacych na stosie wywolujemy funkcje */
-
while (!W.empty())
-
PDD(W.top());
-
-
/* wypisujemy wielkosc poszczeg poddrzew */
-
for ( int i=1 ; i<=n ; i++ )
-
cout<<WPD[i]<<" ";
-
}
-
-
void PDD (int x)
-
{
-
W.pop();
-
IS[LO[x]]--;
-
WPD[x]+=1;
-
WPD[LO[x]]+=WPD[x];
-
if (IS[LO[x]]==0)
-
W.push(LO[x]);
-
}