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.000
0 ≤ 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"; }