0644 – Det Drum2
Cerința[edit | edit source]
Se dă vectorul de tați al unui arbore cu rădăcină cu n
noduri și doua noduri p q
. Determinați drumul elementar de la nodul p
la nodul q
.
Date de intrare[edit | edit source]
Fișierul de intrare detdrum2IN.txt
conține pe prima linie numărul de noduri n
și nodurile p q
. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.
Date de ieșire[edit | edit source]
Fișierul de ieșire detdrum2OUT.txt
va conține pe prima linie nodurile care alcătuiesc drumul determinat, separate printr-un spațiu.
Restricții și precizări[edit | edit source]
1 ≤ n ≤ 100
1 ≤ k ≤ n
- în vectorul de tați rădăcina este marcată cu
0
Exemplul 1[edit | edit source]
detdrum2IN.txt:
7 2 5
4 1 7 0 7 7 1
detdrum2OUT.txt:
2 1 7 5
Exemplul 2[edit | edit source]
detdrum2IN.txt:
101 2 5
4 1 7 0 7 7 1
Output:
Error: n should be between 1 and 100 (inclusive).
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def validate_input(n, k):
if not (1 <= n <= 100): print("Error: n should be between 1 and 100 (inclusive).") return False if not (1 <= k <= n): print("Error: k should be between 1 and n (inclusive).") return False return True
with open("detdrum2IN.txt", "r") as infile:
n, p, q = map(int, infile.readline().split()) t = [0] + list(map(int, infile.readline().split())) if not validate_input(n, p) or not validate_input(n, q): exit()
v1, v2 = [], []
def afis(x, b):
if x != 0 and t[x] != 0: b.append(x) afis(t[x], b)
ok1, ok2 = 0, 0 afis(p, v1) afis(q, v2) nr1, nr2 = len(v1), len(v2)
for i in range(1, nr1 + 1):
for j in range(1, nr2 + 1): if v1[i - 1] == v2[j - 1]: ok1 = i ok2 = j break
with open("detdrum2OUT.txt", "w") as outfile:
for i in range(0, ok1): outfile.write(f"{v1[i]} ")
for i in range(ok2 - 2, -1, -1): outfile.write(f"{v2[i]} ")
</syntaxhighlight>