4159 – Nivele11
Enunț
Într-un arbore cu rădăcină, nivelul unui nod este lungime lanțului de la rădăcină la acel nod. Astfel, rădăcina este pe nivelul 0, fiii rădăcinii pe nivelul 1, fiii fiilor rădăcinii pe nivelul 2, etc.
Cerința
Se dă vectorul de tați al unui arbore cu rădăcină cu n noduri. Afișați parcurgerea pe nivele a arborelui dat.
Date de intrare
Fișierul de intrare nivele11IN.txt conține pe prima linie numărul de noduri n. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.
Date de ieșire
Fișierul de ieșire nivele11OUT.txt va conține mai multe linii. Fiecare linie i conține, în ordine crescătoare, nodurile aflate pe nivelul i-1, separate prin câte un epațiu.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Nu corespunde restricțiilor impuse".
Restricții și precizări
1 ≤ n ≤ 100- în vectorul de tați rădăcina este marcată cu
0
Exemplul 1:
nivele11IN.txt
8 4 3 0 3 2 1 2 1
nivele11OUT.txt
3 2 4 1 5 7 6 8
Explicație
Pe nivelul 0 se află rădăcina, adică nodul 3. Pe nivelul 1 se află nodurile 2 și 4 (descentenții direcți ai rădăcinii). Pe nivelul 2 se află nodurile 1, 5 și 7. Pe ultimul nivel se află nodurile 6 și 8.
Exemplul 2:
nivele11IN.txt
101 4 3 0 3 2 1 2 1
nivele11OUT.txt
Datele nu corespund restrictiilor impuse
Rezolvare
<syntaxhighlight lang="python3" line="1"> from collections import defaultdict, deque
def verificare_restrictii(n):
if 1 <= n <= 100:
return True
else:
with open('nivele11OUT.txt', 'w') as file:
file.write("Datele nu corespund restrictiilor impuse")
return False
def parcurgere_pe_nivele(n, tati):
if not verificare_restrictii(n):
return []
# Construim lista de adiacență pentru arbore graf = defaultdict(list) radacina = -1
for i in range(n):
parinte = tati[i]
if parinte == 0:
radacina = i + 1
else:
graf[parinte].append(i + 1)
# Folosim BFS pentru a parcurge nodurile pe nivele nivele = [] vizitat = [False] * (n + 1) queue = deque([(radacina, 0)]) # Rădăcina se află pe nivelul 0
while queue:
nod, nivel = queue.popleft()
if not vizitat[nod]:
vizitat[nod] = True
# Adăugăm nodul la lista corespunzătoare nivelului său
if len(nivele) <= nivel:
nivele.append([])
nivele[nivel].append(nod)
# Adăugăm fiii nodului în coadă cu nivelul actual + 1
for fiu in graf[nod]:
if not vizitat[fiu]:
queue.append((fiu, nivel + 1))
return nivele
- Citim datele din fișierul de intrare
with open('nivele11IN.txt', 'r') as file:
n = int(file.readline().strip()) tati = list(map(int, file.readline().strip().split()))
- Obținem rezultatul
rezultat = parcurgere_pe_nivele(n, tati)
- Dacă rezultatul nu este gol, scriem rezultatul în fișierul de ieșire
if rezultat:
with open('nivele11OUT.txt', 'w') as file:
for nivel in rezultat:
file.write(' '.join(map(str, nivel)) + '\n')
</syntaxhighlight>