335
Cerința
Se dă un vector t=(t[1], t[2], ..., t[n]) care memorează numere naturale cuprinse între 0 și n. Să se verifice dacă t este sau nu vector de tați asociat unui arbore cu rădăcină.
Date de intrare
Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații.
Date de ieșire
Programul va afișa pe ecran mesajul DA, dacă t este vector de tați, sau mesajul NU în caz contrar.
Restricții și precizări
1 ≤ n ≤ 100.0000 ≤ t[i] ≤ n
Exemplul 1:
Intrare
5 0 1 1 3 3
Ieșire
DA
Explicație
Vectorul corespunde arborelui cu rădăcină din imagine.

Exemplul 2:
Intrare
5 2 0 2 5 4
Ieșire
NU
Explicație
Nodul 4 are ca tată pe 5, iar nodul 5 are ca tată pe 4
#include <bits/stdc++.h>
using namespace std;
vector <int> G[100001];
int n , p , x , y , k , T[100002] , P[100001];
void dfs(int x)
{
P[x] = 1;
for(auto i:G[x])
if(!P[i]) dfs(i);
}
int main()
{
cin >> n;
for(int i = 1 ; i <= n ; i++)
{
cin >> T[i];
if(T[i] != 0)
{
G[T[i]].push_back(i);
G[i].push_back(T[i]);
}
if(T[i] == 0) p = i;
}
dfs(p);
int ok = 0;
for(int i = 1 ; i <= n ; i++)
if(!P[i]) ok++;
if(ok == 0 && p != 0) cout << "DA";
else cout << "NU";
}
Comentarii