<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Simina</id>
	<title>Bitnami MediaWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Simina"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/Simina"/>
	<updated>2026-05-02T01:19:23Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3058_-_vip&amp;diff=9698</id>
		<title>3058 - vip</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3058_-_vip&amp;diff=9698"/>
		<updated>2024-03-22T19:08:30Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Două personaje ale căror nume se vor da în datele de intrare (momentan îi numim Bossanip și Dicsi) își petrec nopțile prin discoteci. Toată lumea știe că Bossanip este membru V.I.P în toate discotecile din lume și Dicsi profită mereu de celebritatea prietenului său. Ajuns pe meleaguri străine, Dicsi s-a confruntat cu o problemă foarte mare. Cum intră la V.I.P când este pe cont propriu? Astfel, Dicsi s-a apucat de infracțiuni precum furtul de identitate. Dicsi dorește să permute literele din numele lui (să găsească o anagramă a propriului nume) astfel încât noul nume să difere prin exact &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; poziții de numele lui Bossanip. Mai mult, dorește ca această anagramă să fie minimă lexicografic. Dacă reușește, este posibil să se dea drept Bossanip și să intre și el ca membru V.I.P.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
În fișierul text &amp;lt;code&amp;gt;vipIN.txt&amp;lt;/code&amp;gt; pe prima linie se află numărul natural &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;3∙T&amp;lt;/code&amp;gt; linii sunt descrise &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; seturi de date de intrare, fiecare set ocupă câte trei linii astfel: pe prima linie a unui set se află scrise două numere naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (lungimea numelor reale ale lui Bossanip și Dicsi) și &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;; pe a doua linie a unui set este scris numele lui Bossanip dat printr-un șir de caractere &amp;lt;code&amp;gt;s1&amp;lt;/code&amp;gt;; pe a treia linie a unui set este scris numele lui Dicsi dat printr-un șir de caractere &amp;lt;code&amp;gt;s2&amp;lt;/code&amp;gt;. Din fericire pentru Dicsi, cele două personaje au nume de aceeași lungime.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
În fișierul text &amp;lt;code&amp;gt;vipOUT.txt&amp;lt;/code&amp;gt; se vor scrie, pe fiecare din cele &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; linii câte un șir de caractere, pe a &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;-a linie este scrisă anagrama corespunzătoare testului &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; (noul nume al lui Dicsi) sau &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; dacă nu există o astfel de anagramă. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ N, K ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Suma valorilor lui &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; din cadrul seturilor de test este mai mică sau egală cu &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Toate literele sunt litere mici ale alfabetului englez&lt;br /&gt;
* Dacă nu există soluție pentru un test, atunci se va afișa valoarea &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Un șir &amp;lt;code&amp;gt;p1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;p2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;pN&amp;lt;/code&amp;gt; este mai mic lexicografic decât un alt șir &amp;lt;code&amp;gt;q1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;qN&amp;lt;/code&amp;gt;, dacă există o poziție &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt;, astfel încât &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;lt; qi&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;pj&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;= qj&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ j &amp;lt; i&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru &amp;lt;code&amp;gt;25%&amp;lt;/code&amp;gt; din punctaj se poate afișa orice soluție corectă care nu este neapărat minimă lexicografic&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;vipIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 &lt;br /&gt;
 8 6 &lt;br /&gt;
 corleone &lt;br /&gt;
 vasilica &lt;br /&gt;
 5 2 &lt;br /&gt;
 marko &lt;br /&gt;
 ghita&lt;br /&gt;
&amp;lt;code&amp;gt;vipOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 caaliisv &lt;br /&gt;
 -1&lt;br /&gt;
&lt;br /&gt;
=== Explicație: ===&lt;br /&gt;
În primul set cea mai mică anagramă a șirului &amp;lt;code&amp;gt;vasilica&amp;lt;/code&amp;gt;, din punct de vedere lexicografic, care diferă de șirul &amp;lt;code&amp;gt;corleone&amp;lt;/code&amp;gt; pe exact &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; poziții, este &amp;lt;code&amp;gt;caaliisv&amp;lt;/code&amp;gt; În al doilea set nici una din anagramele șirului &amp;lt;code&amp;gt;ghita&amp;lt;/code&amp;gt; nu poate să difere pe exact două poziții de șirul &amp;lt;code&amp;gt;marko&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;vipIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 &lt;br /&gt;
 80000000000 6 &lt;br /&gt;
 corleone &lt;br /&gt;
 vasilica &lt;br /&gt;
 5 2 &lt;br /&gt;
 marko &lt;br /&gt;
 ghita&lt;br /&gt;
&amp;lt;code&amp;gt;vipOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citeste_intrare(nume_fisier):&lt;br /&gt;
    with open(nume_fisier, &#039;r&#039;) as f:&lt;br /&gt;
        t = int(f.readline().strip())&lt;br /&gt;
        cazuri = []&lt;br /&gt;
        for _ in range(t):&lt;br /&gt;
            n, k = map(int, f.readline().strip().split())&lt;br /&gt;
            s1 = f.readline().strip()&lt;br /&gt;
            s2 = f.readline().strip()&lt;br /&gt;
            cazuri.append((n, k, s1, s2))&lt;br /&gt;
    return cazuri&lt;br /&gt;
&lt;br /&gt;
def verifica_invariant(freq1, freq2, egali, diferiti, sigma=26):&lt;br /&gt;
    nevoie_extra_op = 0&lt;br /&gt;
    max_extra = 0&lt;br /&gt;
    for i in range(1, sigma + 1):&lt;br /&gt;
        extra_car = freq1[i] + freq2[i] - diferiti&lt;br /&gt;
        extra_op = (extra_car + 1) // 2&lt;br /&gt;
        if extra_op &amp;gt; min(freq1[i], freq2[i]):&lt;br /&gt;
            return False&lt;br /&gt;
        max_extra += min(freq1[i], freq2[i])&lt;br /&gt;
        if extra_op &amp;gt; 0:&lt;br /&gt;
            nevoie_extra_op += extra_op&lt;br /&gt;
    return nevoie_extra_op &amp;lt;= egali and egali &amp;lt;= max_extra&lt;br /&gt;
&lt;br /&gt;
def rezolva_caz(n, k, s1, s2):&lt;br /&gt;
    freq1 = [0] * 27&lt;br /&gt;
    freq2 = [0] * 27&lt;br /&gt;
    answer = [&#039;&#039;] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    for char in s1:&lt;br /&gt;
        freq1[ord(char) - ord(&#039;a&#039;) + 1] += 1&lt;br /&gt;
    for char in s2:&lt;br /&gt;
        freq2[ord(char) - ord(&#039;a&#039;) + 1] += 1&lt;br /&gt;
&lt;br /&gt;
    egali = n - k&lt;br /&gt;
    diferiti = k&lt;br /&gt;
&lt;br /&gt;
    if not verifica_invariant(freq1, freq2, egali, diferiti):&lt;br /&gt;
        return &amp;quot;-1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        freq1[ord(s1[i-1]) - ord(&#039;a&#039;) + 1] -= 1&lt;br /&gt;
        for j in range(1, 27):&lt;br /&gt;
            if freq2[j] == 0:&lt;br /&gt;
                continue&lt;br /&gt;
            freq2[j] -= 1&lt;br /&gt;
            if ord(s1[i-1]) - ord(&#039;a&#039;) + 1 == j:&lt;br /&gt;
                egali -= 1&lt;br /&gt;
            else:&lt;br /&gt;
                diferiti -= 1&lt;br /&gt;
&lt;br /&gt;
            if verifica_invariant(freq1, freq2, egali, diferiti):&lt;br /&gt;
                answer[i] = chr(j + ord(&#039;a&#039;) - 1)&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
            if ord(s1[i-1]) - ord(&#039;a&#039;) + 1 == j:&lt;br /&gt;
                egali += 1&lt;br /&gt;
            else:&lt;br /&gt;
                diferiti += 1&lt;br /&gt;
&lt;br /&gt;
            freq2[j] += 1&lt;br /&gt;
&lt;br /&gt;
    return &#039;&#039;.join(answer[1:])&lt;br /&gt;
&lt;br /&gt;
def scrie_iesire(nume_fisier, rezultate):&lt;br /&gt;
    with open(nume_fisier, &#039;w&#039;) as f:&lt;br /&gt;
        for rez in rezultate:&lt;br /&gt;
            f.write(f&amp;quot;{rez}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def verifica_restricții(cazuri, nume_fisier_iesire):&lt;br /&gt;
    suma_n = sum(caz[0] for caz in cazuri)  # Suma tuturor valorilor lui N&lt;br /&gt;
    if not all(1 &amp;lt;= caz[0] &amp;lt;= 100000 and 1 &amp;lt;= caz[1] &amp;lt;= 100000 for caz in cazuri) or suma_n &amp;gt; 1000000:&lt;br /&gt;
        with open(nume_fisier_iesire, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    cazuri = citeste_intrare(&amp;quot;vipIN.txt&amp;quot;)&lt;br /&gt;
    if not verifica_restricții(cazuri, &amp;quot;vipOUT.txt&amp;quot;):&lt;br /&gt;
        return  # Oprește execuția dacă datele nu corespund restricțiilor&lt;br /&gt;
    &lt;br /&gt;
    rezultate = []&lt;br /&gt;
    for caz in cazuri:&lt;br /&gt;
        rezultate.append(rezolva_caz(*caz))&lt;br /&gt;
    scrie_iesire(&amp;quot;vipOUT.txt&amp;quot;, rezultate)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1651_-_Graf&amp;diff=9181</id>
		<title>1651 - Graf</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1651_-_Graf&amp;diff=9181"/>
		<updated>2024-01-07T13:07:58Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat ponderat. Să se determine vârful pentru care media aritmetică a ponderilor muchiilor incidente este minimă. Dacă există mai multe vârfuri cu aceeași medie minimă, se va afișa vârful numerotat cu o valoare mai mică.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numerele &amp;lt;code&amp;gt;n m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri și numărul de muchii din graf, apoi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; triplete &amp;lt;code&amp;gt;i j p&amp;lt;/code&amp;gt;, reprezentând muchiile, date prin extremități și pondere.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul &amp;lt;code&amp;gt;vf&amp;lt;/code&amp;gt;, reprezentând vârful determinat.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* ponderile muchiilor sunt numere naturale nenule mai mici decât &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* graful dat nu conține noduri izolate&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5 6&lt;br /&gt;
 1 2 10&lt;br /&gt;
 2 3 2&lt;br /&gt;
 2 5 2&lt;br /&gt;
 3 5 12&lt;br /&gt;
 3 4 1&lt;br /&gt;
 4 5 5&lt;br /&gt;
Ieșire&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Mediile ponderilor muchiilor incidente cu vârfurile grafului sunt:&lt;br /&gt;
&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;4.66667&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;6.33333&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Astfel media minimă este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, pentru vârful &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;Intrare&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;101&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;consola&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from typing import List, Tuple&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, m, edges):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    for edge in edges:&lt;br /&gt;
        i, j, p = edge&lt;br /&gt;
        if not (1 &amp;lt;= i &amp;lt;= n) or not (1 &amp;lt;= j &amp;lt;= n) or not (1 &amp;lt;= p &amp;lt; 1000):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    nMAX = 100&lt;br /&gt;
    mat = [[] for _ in range(nMAX + 1)]  # mat[i][0] = (j, p) (edge between i and j with weight p)&lt;br /&gt;
&lt;br /&gt;
    n, m = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        print(&amp;quot;Detele nu respecta restrictiile impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    edges = [tuple(map(int, input().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    if not check_constraints(n, m, edges):&lt;br /&gt;
        print(&amp;quot;Detele nu respecta restrictiile impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    for i, j, p in edges:&lt;br /&gt;
        mat[i].append((j, p))&lt;br /&gt;
        mat[j].append((i, p))&lt;br /&gt;
&lt;br /&gt;
    vfmin = 0&lt;br /&gt;
    medmin = float(&#039;inf&#039;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        _sum = sum(weight for _, weight in mat[i])&lt;br /&gt;
        if _sum / len(mat[i]) &amp;lt; medmin:&lt;br /&gt;
            medmin = _sum / len(mat[i])&lt;br /&gt;
            vfmin = i&lt;br /&gt;
&lt;br /&gt;
    print(vfmin)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0640_%E2%80%93_NrFii&amp;diff=9179</id>
		<title>0640 – NrFii</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0640_%E2%80%93_NrFii&amp;diff=9179"/>
		<updated>2024-01-07T13:03:23Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați nodul din arbore cu număr maxim de fii. Dacă în arbore sunt mai multe noduri cu număr maxim de fii, afișați-le pe toate, în ordine crescătoare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;nrfiiIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;nrfiiOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie nodurile din arbore cu număr maxim de fii, în ordine crescătoare, separate printr-un spațiu.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;nrfiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;nrfiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Nodul &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; are număr maxim de fii, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;nrfiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;nrfiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citeste_arbore(file_path):&lt;br /&gt;
    with open(file_path, &#039;r&#039;) as file:&lt;br /&gt;
        n = int(file.readline().strip())&lt;br /&gt;
        tati = list(map(int, file.readline().split()))&lt;br /&gt;
    return n, tati&lt;br /&gt;
&lt;br /&gt;
def verificare_restrictii(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 100:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        with open(&amp;quot;nrfiiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
            file_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def determina_noduri_max_fii(n, tati):&lt;br /&gt;
    fii = [0] * (n + 1)&lt;br /&gt;
    for tata in tati:&lt;br /&gt;
        if tata != -1:&lt;br /&gt;
            fii[tata] += 1&lt;br /&gt;
&lt;br /&gt;
    max_fii = max(fii)&lt;br /&gt;
    noduri_max_fii = [i for i in range(1, n + 1) if fii[i] == max_fii]&lt;br /&gt;
&lt;br /&gt;
    return noduri_max_fii&lt;br /&gt;
&lt;br /&gt;
def scrie_rezultat(file_path, noduri_max_fii):&lt;br /&gt;
    with open(file_path, &#039;w&#039;) as file:&lt;br /&gt;
        if noduri_max_fii:&lt;br /&gt;
            file.write(&#039; &#039;.join(map(str, noduri_max_fii)))&lt;br /&gt;
        else:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    file_input = &amp;quot;nrfiiIN.txt&amp;quot;&lt;br /&gt;
    file_output = &amp;quot;nrfiiOUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    n, tati = citeste_arbore(file_input)&lt;br /&gt;
&lt;br /&gt;
    if verificare_restrictii(n):&lt;br /&gt;
        noduri_max_fii = determina_noduri_max_fii(n, tati)&lt;br /&gt;
        scrie_rezultat(file_output, noduri_max_fii)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0638_-_Nivele&amp;diff=9178</id>
		<title>0638 - Nivele</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0638_-_Nivele&amp;diff=9178"/>
		<updated>2024-01-07T13:02:20Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri din arbore. Determinați pentru fiecare dintre cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri nivelul pe care se află.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;niveleIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații. Linia a treia conține numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar linia a patra &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri, &amp;lt;code&amp;gt;x[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x[2]&amp;lt;/code&amp;gt;, … , &amp;lt;code&amp;gt;x[k]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;niveleOUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii. Linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; va conține nivelul pe care se află nodul &amp;lt;code&amp;gt;x[i]&amp;lt;/code&amp;gt; în arborele dat.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;niveleIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
 4&lt;br /&gt;
 1 3 4 7&lt;br /&gt;
&amp;lt;code&amp;gt;niveleOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 1&lt;br /&gt;
 3 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;niveleIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
 4&lt;br /&gt;
 1 3 4 7&lt;br /&gt;
&amp;lt;code&amp;gt;niveleOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, k, tati):&lt;br /&gt;
    if not(1 &amp;lt;= k &amp;lt;= n &amp;lt;= 100) or tati.count(0) != 1:&lt;br /&gt;
        with open(&amp;quot;niveleOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f_out:&lt;br /&gt;
            f_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def determina_nivelul(n, tati, k, noduri):&lt;br /&gt;
    # Verificare pentru restricții&lt;br /&gt;
    if not verifica_restrictii(n, k, tati):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    nivele = [0] * n  # nivelele pentru fiecare nod&lt;br /&gt;
    radacina = tati.index(0) + 1  # găsim poziția rădăcinii în vectorul de tați&lt;br /&gt;
&lt;br /&gt;
    def dfs(nod, nivel):&lt;br /&gt;
        nivele[nod - 1] = nivel  # nodurile sunt numerotate de la 1, așa că indexăm cu nod-1&lt;br /&gt;
        for fiu in range(1, n + 1):&lt;br /&gt;
            if tati[fiu - 1] == nod:&lt;br /&gt;
                dfs(fiu, nivel + 1)&lt;br /&gt;
&lt;br /&gt;
    dfs(radacina, 1)&lt;br /&gt;
&lt;br /&gt;
    rezultate = [nivele[nod - 1] for nod in noduri]&lt;br /&gt;
&lt;br /&gt;
    # Scrierea rezultatelor în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;niveleOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f_out:&lt;br /&gt;
        for rezultat in rezultate:&lt;br /&gt;
            f_out.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
with open(&amp;quot;niveleIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
    n = int(f.readline().strip())&lt;br /&gt;
    tati = list(map(int, f.readline().split()))&lt;br /&gt;
    k = int(f.readline().strip())&lt;br /&gt;
    noduri = list(map(int, f.readline().split()))&lt;br /&gt;
&lt;br /&gt;
# Determinarea nivelului pentru fiecare nod dat&lt;br /&gt;
determina_nivelul(n, tati, k, noduri)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4167_%E2%80%93_Fl%C8%99iElimin%C4%83&amp;diff=9177</id>
		<title>4167 – FlșiElimină</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4167_%E2%80%93_Fl%C8%99iElimin%C4%83&amp;diff=9177"/>
		<updated>2024-01-07T13:01:15Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră o listă liniară simplu înlănțuită, alocată dinamic, în care elementele sunt de tipul declarat mai jos:&lt;br /&gt;
 struct Nod&lt;br /&gt;
 {&lt;br /&gt;
     int info;&lt;br /&gt;
     Nod *leg;&lt;br /&gt;
 };&lt;br /&gt;
în care câmpul &amp;lt;code&amp;gt;info&amp;lt;/code&amp;gt; memorează un număr întreg, iar câmpul &amp;lt;code&amp;gt;leg&amp;lt;/code&amp;gt; memorează adresa următorului element al listei.&lt;br /&gt;
&lt;br /&gt;
= Cerinţa =&lt;br /&gt;
Să se scrie o funcție python cu următorul prototip:&lt;br /&gt;
 def FLsiElimina(head): head = None&lt;br /&gt;
care, în lista pentru care primul element are adresa memorată în pointerul &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;, elimină toate nodurile cuprinse între cel mai din stânga nod care memorează un număr divizibil cu &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și cel mai din dreapta nod care memorează un număr divizibil cu &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, inclusiv acestea. Se garantează că lista va conține cel puțin două noduri care au informația divizibilă cu &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. Dacă se elimină toate nodurile, atunci după apelul funcției trebuie ca &amp;lt;code&amp;gt;head = NULL&amp;lt;/code&amp;gt;. De exemplu, dacă lista conține inițial informațiile &amp;lt;code&amp;gt;1,27,3,4,13,12,44,23&amp;lt;/code&amp;gt;, atunci la final lista va fi: &amp;lt;code&amp;gt;1,44,23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Important =&lt;br /&gt;
Soluţia propusă va conţine definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
class Nod:&lt;br /&gt;
    def __init__(self, info):&lt;br /&gt;
        self.info = info&lt;br /&gt;
        self.leg = None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def FLsiElimina(head):&lt;br /&gt;
    # Cautăm primul nod cu informația divizibilă cu 3&lt;br /&gt;
    primul_nod = None&lt;br /&gt;
    nod_curent = head&lt;br /&gt;
&lt;br /&gt;
    while nod_curent is not None and nod_curent.info % 3 != 0:&lt;br /&gt;
        primul_nod = nod_curent&lt;br /&gt;
        nod_curent = nod_curent.leg&lt;br /&gt;
&lt;br /&gt;
    # Cautăm ultimul nod cu informația divizibilă cu 3&lt;br /&gt;
    ultimul_nod = None&lt;br /&gt;
    nod_curent = head&lt;br /&gt;
    while nod_curent is not None:&lt;br /&gt;
        if nod_curent.info % 3 == 0:&lt;br /&gt;
            ultimul_nod = nod_curent&lt;br /&gt;
        nod_curent = nod_curent.leg&lt;br /&gt;
&lt;br /&gt;
    # Eliminăm nodurile cuprinse între primul_nod și ultimul_nod, inclusiv acestea&lt;br /&gt;
    nod_curent = head&lt;br /&gt;
    while nod_curent is not None and nod_curent != primul_nod:&lt;br /&gt;
        nod_urmator = nod_curent.leg&lt;br /&gt;
        del nod_curent&lt;br /&gt;
        nod_curent = nod_urmator&lt;br /&gt;
&lt;br /&gt;
    if primul_nod is not None:&lt;br /&gt;
        primul_nod.leg = ultimul_nod.leg&lt;br /&gt;
        nod_curent = ultimul_nod.leg&lt;br /&gt;
        while nod_curent is not None:&lt;br /&gt;
            nod_urmator = nod_curent.leg&lt;br /&gt;
            del nod_curent&lt;br /&gt;
            nod_curent = nod_urmator&lt;br /&gt;
    else:&lt;br /&gt;
        # Dacă primul_nod este None, eliminăm toate nodurile de la început până la ultimul_nod&lt;br /&gt;
        head = ultimul_nod.leg&lt;br /&gt;
        nod_curent = ultimul_nod.leg&lt;br /&gt;
        while nod_curent is not None:&lt;br /&gt;
            nod_urmator = nod_curent.leg&lt;br /&gt;
            del nod_curent&lt;br /&gt;
            nod_curent = nod_urmator&lt;br /&gt;
&lt;br /&gt;
    return head&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcție de afișare a listei&lt;br /&gt;
def afisare_lista(head):&lt;br /&gt;
    while head is not None:&lt;br /&gt;
        print(head.info, end=&amp;quot; &amp;quot;)&lt;br /&gt;
        head = head.leg&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
head = Nod(1)&lt;br /&gt;
head.leg = Nod(27)&lt;br /&gt;
head.leg.leg = Nod(3)&lt;br /&gt;
head.leg.leg.leg = Nod(4)&lt;br /&gt;
head.leg.leg.leg.leg = Nod(13)&lt;br /&gt;
head.leg.leg.leg.leg.leg = Nod(12)&lt;br /&gt;
head.leg.leg.leg.leg.leg.leg = Nod(44)&lt;br /&gt;
head.leg.leg.leg.leg.leg.leg.leg = Nod(23)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Lista initiala:&amp;quot;, end=&amp;quot; &amp;quot;)&lt;br /&gt;
afisare_lista(head)&lt;br /&gt;
&lt;br /&gt;
head = FLsiElimina(head)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Lista finala:&amp;quot;, end=&amp;quot; &amp;quot;)&lt;br /&gt;
afisare_lista(head)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0963_-_Bazine&amp;diff=9176</id>
		<title>0963 - Bazine</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0963_-_Bazine&amp;diff=9176"/>
		<updated>2024-01-07T12:58:17Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
La ştrandul Junior din oraşul nostru s-au construit &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; bazine pentru înot. Fiecare bazin a fost dotat cu câte un robinet pentru umplerea acestuia cu apă. Între &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; perechi distincte de bazine, a fost instalată câte o ţeavă prin care apa din cele două bazine din fiecare pereche să poată circula. Astfel, cele două bazine din pereche pot fi umplute prin deschiderea unui singur robinet.&lt;br /&gt;
&lt;br /&gt;
Administratorul bazei a numerotat bazinele cu numerele distincte de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi a notat în registrul lui cele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; perechi de numere &amp;lt;code&amp;gt;(x1,y1)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(x2,y2)&amp;lt;/code&amp;gt;,…., &amp;lt;code&amp;gt;(xm,ym)&amp;lt;/code&amp;gt; corespunzând perechilor de bazine între care a fost instalată câte o ţeavă. Pentru a umple toate bazinele cu apă, administratorul doreşte să deschidă un număr minim de robinete.&lt;br /&gt;
&lt;br /&gt;
Cerinţă.&lt;br /&gt;
&lt;br /&gt;
Scrieţi un program care să citească numerele naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, şi cele &amp;lt;code&amp;gt;2*m&amp;lt;/code&amp;gt; numere naturale &amp;lt;code&amp;gt;x1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y2&amp;lt;/code&amp;gt;,…., &amp;lt;code&amp;gt;xm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ym&amp;lt;/code&amp;gt;, cu semnificația din enunț, şi care să afişeze cel mai mic număr &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; de robinete pe care trebuie să le deschidă administratorul astfel încât să fie umplute cu apă toate bazinele.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;bazineIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n m&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii căte o pereche de numere &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;bazineOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; determinat.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;10 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;8 ≤ m ≤ 400&amp;lt;/code&amp;gt;&lt;br /&gt;
* nu există două perechi de numere &amp;lt;code&amp;gt;(x,y)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(x’,y’)&amp;lt;/code&amp;gt; astfel încât &amp;lt;code&amp;gt;x=x’&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;y=y’&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;x=y’&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;y=x’&amp;lt;/code&amp;gt; printre cele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; perechi citite din fişier&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ xi ≤ n&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;1 ≤ yi ≤ n&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;xi ≠ yi&amp;lt;/code&amp;gt;&lt;br /&gt;
* fiecare bazin poate fi cuplat la unul sau mai multe bazine prin câte o ţeavă, sau la nici un bazin&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
&amp;lt;code&amp;gt;bazineIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 10 8&lt;br /&gt;
 1 6&lt;br /&gt;
 4 5&lt;br /&gt;
 8 6&lt;br /&gt;
 3 7&lt;br /&gt;
 9 4&lt;br /&gt;
 1 8&lt;br /&gt;
 10 6&lt;br /&gt;
 1 10&lt;br /&gt;
&amp;lt;code&amp;gt;bazineOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Apa din bazinele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; comunică doar între acestea, fiind instalate ţevi. Astfel pentru aceste patru bazine este necesar să se deschidă un singur robinet pentru umplerea lor.&lt;br /&gt;
&lt;br /&gt;
Apa din bazinele &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; comunică, deoarece între acestea sunt ţevi. Astfel pentru aceste bazine este necesar să se deschidă un singur robinet.&lt;br /&gt;
&lt;br /&gt;
Pentru bazinele &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; între care există teavă, se deschide un singur robinet, cele două bazine nefiind legate prin ţevi de celelalte bazine&lt;br /&gt;
&lt;br /&gt;
Bazinul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; nu este cuplat cu niciun alt bazin, fiind necesar să se deschidă robinetul acestuia.&lt;br /&gt;
&lt;br /&gt;
În total se deschid doar &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; robinete pentru a alimenta toate bazinele&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
&amp;lt;code&amp;gt;bazineIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 5&lt;br /&gt;
&amp;lt;code&amp;gt;bazineOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
Rezolvare&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class Graf:&lt;br /&gt;
    def __init__(self, varfuri):&lt;br /&gt;
        self.varfuri = varfuri&lt;br /&gt;
        self.lista_adiacenta = {i: [] for i in range(1, varfuri + 1)}&lt;br /&gt;
&lt;br /&gt;
    def adauga_muchie(self, u, v):&lt;br /&gt;
        self.lista_adiacenta[u].append(v)&lt;br /&gt;
        self.lista_adiacenta[v].append(u)&lt;br /&gt;
&lt;br /&gt;
    def numar_minim_robinete(self):&lt;br /&gt;
        vizitate = set()&lt;br /&gt;
        robinete = 0&lt;br /&gt;
&lt;br /&gt;
        for varf in range(1, self.varfuri + 1):&lt;br /&gt;
            if varf not in vizitate:&lt;br /&gt;
                robinete += 1&lt;br /&gt;
                self.dfs(varf, vizitate)&lt;br /&gt;
&lt;br /&gt;
        return robinete&lt;br /&gt;
&lt;br /&gt;
    def dfs(self, varf, vizitate):&lt;br /&gt;
        vizitate.add(varf)&lt;br /&gt;
        for vecin in self.lista_adiacenta[varf]:&lt;br /&gt;
            if vecin not in vizitate:&lt;br /&gt;
                self.dfs(vecin, vizitate)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, m, perechi):&lt;br /&gt;
    if not(10 &amp;lt;= n &amp;lt;= 100) or not(8 &amp;lt;= m &amp;lt;= 400):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        x, y = perechi[i]&lt;br /&gt;
        if not(1 &amp;lt;= x &amp;lt;= n) or not(1 &amp;lt;= y &amp;lt;= n) or x == y:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        for j in range(i + 1, m):&lt;br /&gt;
            if set(perechi[i]) == set(perechi[j]):&lt;br /&gt;
                return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;bazineIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fisier_intrare:&lt;br /&gt;
        n, m = map(int, fisier_intrare.readline().split())&lt;br /&gt;
        perechi = [tuple(map(int, fisier_intrare.readline().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
        if not verifica_restrictii(n, m, perechi):&lt;br /&gt;
            with open(&amp;quot;bazineOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
                fisier_iesire.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            graf = Graf(n)&lt;br /&gt;
&lt;br /&gt;
            for x, y in perechi:&lt;br /&gt;
                graf.adauga_muchie(x, y)&lt;br /&gt;
&lt;br /&gt;
            with open(&amp;quot;bazineOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
                k = graf.numar_minim_robinete()&lt;br /&gt;
                fisier_iesire.write(str(k))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3556_-_xorsum&amp;diff=9175</id>
		<title>3556 - xorsum</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3556_-_xorsum&amp;diff=9175"/>
		<updated>2024-01-07T12:54:00Z</updated>

		<summary type="html">&lt;p&gt;Simina: /* Exemplul 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dau numerele naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;. Se generează vectorul &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; astfel: &amp;lt;code&amp;gt;a[i] = (a[i-1] * x + y) % z&amp;lt;/code&amp;gt;, pentru &amp;lt;code&amp;gt;1 ≤ i ≤ n&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;a[i] = 0&amp;lt;/code&amp;gt; pentru &amp;lt;code&amp;gt;i = 0&amp;lt;/code&amp;gt;. Determinați &amp;lt;code&amp;gt;∑(a[i] XOR a[j])&amp;lt;/code&amp;gt;, unde &amp;lt;code&amp;gt;1 ≤ i &amp;lt; j ≤ n&amp;lt;/code&amp;gt;, modulo &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;z&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul cerut.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 250.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ x, y, z, t &amp;lt; 2^62&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 =&lt;br /&gt;
Intrare&lt;br /&gt;
 250001 1 1 4 7&lt;br /&gt;
Ieșire&lt;br /&gt;
 6&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
&amp;lt;code&amp;gt;a = {0, 1, 2, 3}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;S = ((1 XOR 2) + (1 XOR 3) + (2 XOR 3)) MOD 7 = (3 + 2 + 1) MOD 7 = 6&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
&amp;lt;code&amp;gt;Intrare&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;3 1 1 4 7&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;consola&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;Datele introduse nu respectă restricțiile.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def check_restrictions(n, x, y, z, t):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 250000):&lt;br /&gt;
        print(&amp;quot;Eroare: n trebuie să fie între 1 și 250,000.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= x &amp;lt; 2**62 and 1 &amp;lt;= y &amp;lt; 2**62 and 1 &amp;lt;= z &amp;lt; 2**62 and 1 &amp;lt;= t &amp;lt; 2**62):&lt;br /&gt;
        print(&amp;quot;Eroare: x, y, z, și t trebuie să fie între 1 și 2^62.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def calculate_xor_sum(n, x, y, z, t):&lt;br /&gt;
    if not check_restrictions(n, x, y, z, t):&lt;br /&gt;
        print(&amp;quot;Datele introduse nu respectă restricțiile.&amp;quot;)&lt;br /&gt;
        return None&lt;br /&gt;
&lt;br /&gt;
    a = [0] * (n + 1)&lt;br /&gt;
    xor_sum = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        a[i] = (a[i - 1] * x + y) % z&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(i + 1, n + 1):&lt;br /&gt;
            xor_sum = (xor_sum + (a[i] ^ a[j])) % t&lt;br /&gt;
&lt;br /&gt;
    return xor_sum&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare cu mesaje și verificare restricții&lt;br /&gt;
input_values = input(&amp;quot;Introduceți valorile separate prin spațiu (n x y z t): &amp;quot;).split()&lt;br /&gt;
&lt;br /&gt;
# Verificare dacă numărul de valori introduse este corect&lt;br /&gt;
if len(input_values) != 5:&lt;br /&gt;
    print(&amp;quot;Eroare: Trebuie să introduceți exact 5 valori.&amp;quot;)&lt;br /&gt;
else:&lt;br /&gt;
    n, x, y, z, t = map(int, input_values)&lt;br /&gt;
    # Calcularea și afișarea rezultatului&lt;br /&gt;
    result = calculate_xor_sum(n, x, y, z, t)&lt;br /&gt;
    if result is not None:&lt;br /&gt;
        print(&amp;quot;Rezultatul este:&amp;quot;, result)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1887_-_Dijkstra2&amp;diff=8579</id>
		<title>1887 - Dijkstra2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1887_-_Dijkstra2&amp;diff=8579"/>
		<updated>2023-12-27T18:08:37Z</updated>

		<summary type="html">&lt;p&gt;Simina: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Dijkstra este un cetățean model al comunității în care trăiește. El își ajută fiecare vecin aflat în necaz. Astăzi, Vlad îi cere ajutorul și îl roagă să livreze câte un pachet fiecărui vecin de-al lor. Știind că sunt &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; case în aceasta comunitate, iar distanțele dintre ele variază, Dijkstra vă roagă să realizați un program care să afișeze costul drumului minim dintre casa &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, casa lui Vlad, și casele vecinilor. În cazul în care nu există drum până la unul dintre vecini, se va afișa &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește din fișier numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, numărul de case din comunitate, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, numărul de drumuri dintre case, &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, numărul casei lui Vlad, iar pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii se vor afla &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; cu semnificația că există drum între casele &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; de lungime &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere separate printr-un spațiu, al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea număr reprezentând distanța minimă de la casa lui Vlad la casa &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ p ≤ n ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m ≤ 250.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* cele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; distanțe citite vor fi mai mici decât &amp;lt;code&amp;gt;20.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstra2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 6 2&lt;br /&gt;
 3 5 1&lt;br /&gt;
 5 4 9&lt;br /&gt;
 4 3 5&lt;br /&gt;
 1 2 2&lt;br /&gt;
 3 2 2&lt;br /&gt;
 1 3 8&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstra2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 0 2 7 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Drumurile minime de la casa lui Vlad la celelalte case sunt &amp;lt;code&amp;gt;2 0 2 7 3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstra2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 10000000 22 44&lt;br /&gt;
 3 5 1&lt;br /&gt;
 5 4 9&lt;br /&gt;
 4 3 5&lt;br /&gt;
 1 2 2&lt;br /&gt;
 3 2 2&lt;br /&gt;
 1 3 8&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstra2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
def dijkstra(n, m, p, drumuri):&lt;br /&gt;
    graf = {i: [] for i in range(1, n+1)}&lt;br /&gt;
    &lt;br /&gt;
    for drum in drumuri:&lt;br /&gt;
        x, y, d = drum&lt;br /&gt;
        graf[x].append((y, d))&lt;br /&gt;
        graf[y].append((x, d))&lt;br /&gt;
    &lt;br /&gt;
    distante = {i: float(&#039;inf&#039;) for i in range(1, n+1)}&lt;br /&gt;
    distante[p] = 0&lt;br /&gt;
    coada_prioritati = [(0, p)]&lt;br /&gt;
    &lt;br /&gt;
    while coada_prioritati:&lt;br /&gt;
        distanta_curenta, nod_curent = heapq.heappop(coada_prioritati)&lt;br /&gt;
        &lt;br /&gt;
        if distanta_curenta &amp;gt; distante[nod_curent]:&lt;br /&gt;
            continue&lt;br /&gt;
        &lt;br /&gt;
        for vecin, cost_muchie in graf[nod_curent]:&lt;br /&gt;
            distanta_noua = distante[nod_curent] + cost_muchie&lt;br /&gt;
            &lt;br /&gt;
            if distanta_noua &amp;lt; distante[vecin]:&lt;br /&gt;
                distante[vecin] = distanta_noua&lt;br /&gt;
                heapq.heappush(coada_prioritati, (distanta_noua, vecin))&lt;br /&gt;
    &lt;br /&gt;
    return distante&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, m, p, drumuri):&lt;br /&gt;
    if not (1 &amp;lt;= p &amp;lt;= n &amp;lt;= 100000) or not (1 &amp;lt;= m &amp;lt;= 250000):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for drum in drumuri:&lt;br /&gt;
        if drum[2] &amp;gt;= 20000:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
# Citire date de intrare din fișier&lt;br /&gt;
with open(&#039;dijkstra2IN.txt&#039;, &#039;r&#039;) as fisier_intrare:&lt;br /&gt;
    n, m, p = map(int, fisier_intrare.readline().split())&lt;br /&gt;
    drumuri = [list(map(int, fisier_intrare.readline().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
# Verificare restricții&lt;br /&gt;
if not verifica_restrictii(n, m, p, drumuri):&lt;br /&gt;
    with open(&#039;dijkstra2OUT.txt&#039;, &#039;w&#039;) as fisier_iesire:&lt;br /&gt;
        fisier_iesire.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
else:&lt;br /&gt;
    # Calculare distanțe minime&lt;br /&gt;
    distante = dijkstra(n, m, p, drumuri)&lt;br /&gt;
&lt;br /&gt;
    # Afisare rezultat în fișier&lt;br /&gt;
    with open(&#039;dijkstra2OUT.txt&#039;, &#039;w&#039;) as fisier_iesire:&lt;br /&gt;
        fisier_iesire.write(&#039; &#039;.join(map(str, [distante[i] if distante[i] != float(&#039;inf&#039;) else -1 for i in range(1, n+1)])))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0588_-_Dijkstra&amp;diff=8578</id>
		<title>0588 - Dijkstra</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0588_-_Dijkstra&amp;diff=8578"/>
		<updated>2023-12-27T18:08:15Z</updated>

		<summary type="html">&lt;p&gt;Simina: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un graf orientat ponderat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri – în care fiecare arc are asociat un cost, număr natural strict pozitiv, și un nod &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;. Să se determine, folosind algoritmul lui Dijkstra, costul minim al drumului de la &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; la fiecare nod al grafului.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;dijkstraIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n p&amp;lt;/code&amp;gt;, iar următoarele linii câte un triplet &amp;lt;code&amp;gt;i j c&amp;lt;/code&amp;gt;, cu semnificația: există arcul &amp;lt;code&amp;gt;(i j)&amp;lt;/code&amp;gt; și are costul &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;dijkstraOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere, separate prin exact un spațiu, al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea număr reprezentând costul drumului minim de la &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Dacă nu există drum de la &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; la un anumit vârf, costul afișat va fi &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* costul unui arc va fi mai mic decât &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* costul unui drum este egal cu suma costurilor arcelor care îl compun&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstraIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 4&lt;br /&gt;
 1 3 1&lt;br /&gt;
 2 1 2&lt;br /&gt;
 4 2 1&lt;br /&gt;
 4 3 8&lt;br /&gt;
 5 3 5&lt;br /&gt;
 5 4 2&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstraOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 1 4 0 -1&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstraIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001 12&lt;br /&gt;
 1 3 1&lt;br /&gt;
 2 1 2&lt;br /&gt;
 4 2 1&lt;br /&gt;
 4 3 8&lt;br /&gt;
 5 3 5&lt;br /&gt;
 5 4 2&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstraOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
def dijkstra(graph, start):&lt;br /&gt;
    n = len(graph)&lt;br /&gt;
    INF = float(&#039;inf&#039;)&lt;br /&gt;
    distante = [INF] * n&lt;br /&gt;
    distante[start] = 0&lt;br /&gt;
    heap = [(0, start)]&lt;br /&gt;
&lt;br /&gt;
    while heap:&lt;br /&gt;
        dist_curenta, nod_curent = heapq.heappop(heap)&lt;br /&gt;
&lt;br /&gt;
        if dist_curenta &amp;gt; distante[nod_curent]:&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        for vecin, cost in graph[nod_curent]:&lt;br /&gt;
            distanta_noua = dist_curenta + cost&lt;br /&gt;
            if distanta_noua &amp;lt; distante[vecin]:&lt;br /&gt;
                distante[vecin] = distanta_noua&lt;br /&gt;
                heapq.heappush(heap, (distanta_noua, vecin))&lt;br /&gt;
&lt;br /&gt;
    return distante&lt;br /&gt;
&lt;br /&gt;
def verificare_restrictii(n, graph):&lt;br /&gt;
    # Verificarea restrictiilor&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    for node_edges in graph:&lt;br /&gt;
        for _, cost in node_edges:&lt;br /&gt;
            if not (cost &amp;lt; 1000):&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def citeste_intrare(file_path):&lt;br /&gt;
    with open(file_path, &#039;r&#039;) as file:&lt;br /&gt;
        n, p = map(int, file.readline().split())&lt;br /&gt;
        &lt;br /&gt;
        # Verificare restrictii&lt;br /&gt;
        if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
            return n, p, None&lt;br /&gt;
&lt;br /&gt;
        graf = [[] for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            i, j, c = map(int, file.readline().split())&lt;br /&gt;
            graf[i-1].append((j-1, c))&lt;br /&gt;
&lt;br /&gt;
    return n, p, graf&lt;br /&gt;
&lt;br /&gt;
def scrie_iesire(file_path, distante, restrictii_valide):&lt;br /&gt;
    with open(file_path, &#039;w&#039;) as file:&lt;br /&gt;
        if not restrictii_valide:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            for dist in distante:&lt;br /&gt;
                if dist == float(&#039;inf&#039;):&lt;br /&gt;
                    file.write(&amp;quot;-1 &amp;quot;)&lt;br /&gt;
                else:&lt;br /&gt;
                    file.write(str(dist) + &amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    fisier_intrare = &#039;dijkstraIN.txt&#039;&lt;br /&gt;
    fisier_iesire = &#039;dijkstraOUT.txt&#039;&lt;br /&gt;
&lt;br /&gt;
    n, p, graf = citeste_intrare(fisier_intrare)&lt;br /&gt;
&lt;br /&gt;
    # Verificare restricții&lt;br /&gt;
    restrictii_valide = verificare_restrictii(n, graf)&lt;br /&gt;
&lt;br /&gt;
    if not restrictii_valide:&lt;br /&gt;
        # Dacă restricțiile nu sunt respectate, scrie mesajul în fișierul de ieșire&lt;br /&gt;
        scrie_iesire(fisier_iesire, [], restrictii_valide)&lt;br /&gt;
    else:&lt;br /&gt;
        # Altfel, aplică algoritmul lui Dijkstra și scrie rezultatele în fișierul de ieșire&lt;br /&gt;
        distante = dijkstra(graf, p-1)&lt;br /&gt;
        scrie_iesire(fisier_iesire, distante, restrictii_valide)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1887_-_Dijkstra2&amp;diff=8577</id>
		<title>1887 - Dijkstra2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1887_-_Dijkstra2&amp;diff=8577"/>
		<updated>2023-12-27T18:07:11Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Dijkstra este un cetățean model al comunității în care trăiește. El își ajută fiecare vecin aflat în necaz. Astăzi, Vlad îi cere ajutorul și îl roagă să livreze câte un pachet fiecărui vecin de-al lor. Știind că sunt &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; case în aceasta comunitate, iar distanțele dintre ele variază, Dijkstra vă roagă să realizați un program care să afișeze costul drumului minim dintre casa &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, casa lui Vlad, și casele vecinilo...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Dijkstra este un cetățean model al comunității în care trăiește. El își ajută fiecare vecin aflat în necaz. Astăzi, Vlad îi cere ajutorul și îl roagă să livreze câte un pachet fiecărui vecin de-al lor. Știind că sunt &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; case în aceasta comunitate, iar distanțele dintre ele variază, Dijkstra vă roagă să realizați un program care să afișeze costul drumului minim dintre casa &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, casa lui Vlad, și casele vecinilor. În cazul în care nu există drum până la unul dintre vecini, se va afișa &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește din fișier numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, numărul de case din comunitate, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, numărul de drumuri dintre case, &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, numărul casei lui Vlad, iar pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii se vor afla &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; cu semnificația că există drum între casele &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; de lungime &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere separate printr-un spațiu, al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea număr reprezentând distanța minimă de la casa lui Vlad la casa &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ p ≤ n ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m ≤ 250.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* cele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; distanțe citite vor fi mai mici decât &amp;lt;code&amp;gt;20.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstra2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 6 2&lt;br /&gt;
 3 5 1&lt;br /&gt;
 5 4 9&lt;br /&gt;
 4 3 5&lt;br /&gt;
 1 2 2&lt;br /&gt;
 3 2 2&lt;br /&gt;
 1 3 8&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstra2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 0 2 7 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Drumurile minime de la casa lui Vlad la celelalte case sunt &amp;lt;code&amp;gt;2 0 2 7 3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstra2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 10000000 22 44&lt;br /&gt;
 3 5 1&lt;br /&gt;
 5 4 9&lt;br /&gt;
 4 3 5&lt;br /&gt;
 1 2 2&lt;br /&gt;
 3 2 2&lt;br /&gt;
 1 3 8&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstra2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
def dijkstra(n, m, p, drumuri):&lt;br /&gt;
    graf = {i: [] for i in range(1, n+1)}&lt;br /&gt;
    &lt;br /&gt;
    for drum in drumuri:&lt;br /&gt;
        x, y, d = drum&lt;br /&gt;
        graf[x].append((y, d))&lt;br /&gt;
        graf[y].append((x, d))&lt;br /&gt;
    &lt;br /&gt;
    distante = {i: float(&#039;inf&#039;) for i in range(1, n+1)}&lt;br /&gt;
    distante[p] = 0&lt;br /&gt;
    coada_prioritati = [(0, p)]&lt;br /&gt;
    &lt;br /&gt;
    while coada_prioritati:&lt;br /&gt;
        distanta_curenta, nod_curent = heapq.heappop(coada_prioritati)&lt;br /&gt;
        &lt;br /&gt;
        if distanta_curenta &amp;gt; distante[nod_curent]:&lt;br /&gt;
            continue&lt;br /&gt;
        &lt;br /&gt;
        for vecin, cost_muchie in graf[nod_curent]:&lt;br /&gt;
            distanta_noua = distante[nod_curent] + cost_muchie&lt;br /&gt;
            &lt;br /&gt;
            if distanta_noua &amp;lt; distante[vecin]:&lt;br /&gt;
                distante[vecin] = distanta_noua&lt;br /&gt;
                heapq.heappush(coada_prioritati, (distanta_noua, vecin))&lt;br /&gt;
    &lt;br /&gt;
    return distante&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, m, p, drumuri):&lt;br /&gt;
    if not (1 &amp;lt;= p &amp;lt;= n &amp;lt;= 100000) or not (1 &amp;lt;= m &amp;lt;= 250000):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for drum in drumuri:&lt;br /&gt;
        if drum[2] &amp;gt;= 20000:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
# Citire date de intrare din fișier&lt;br /&gt;
with open(&#039;dijkstra2IN.txt&#039;, &#039;r&#039;) as fisier_intrare:&lt;br /&gt;
    n, m, p = map(int, fisier_intrare.readline().split())&lt;br /&gt;
    drumuri = [list(map(int, fisier_intrare.readline().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
# Verificare restricții&lt;br /&gt;
if not verifica_restrictii(n, m, p, drumuri):&lt;br /&gt;
    with open(&#039;dijkstra2OUT.txt&#039;, &#039;w&#039;) as fisier_iesire:&lt;br /&gt;
        fisier_iesire.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
else:&lt;br /&gt;
    # Calculare distanțe minime&lt;br /&gt;
    distante = dijkstra(n, m, p, drumuri)&lt;br /&gt;
&lt;br /&gt;
    # Afisare rezultat în fișier&lt;br /&gt;
    with open(&#039;dijkstra2OUT.txt&#039;, &#039;w&#039;) as fisier_iesire:&lt;br /&gt;
        fisier_iesire.write(&#039; &#039;.join(map(str, [distante[i] if distante[i] != float(&#039;inf&#039;) else -1 for i in range(1, n+1)])))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0588_-_Dijkstra&amp;diff=8576</id>
		<title>0588 - Dijkstra</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0588_-_Dijkstra&amp;diff=8576"/>
		<updated>2023-12-27T18:01:54Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Se dă un graf orientat ponderat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri – în care fiecare arc are asociat un cost, număr natural strict pozitiv, și un nod &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;. Să se determine, folosind algoritmul lui Dijkstra, costul minim al drumului de la &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; la fiecare nod al grafului.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;dijkstraIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n p&amp;lt;/code&amp;gt;, iar următoarele linii câte un triplet &amp;lt;code&amp;gt;i j c&amp;lt;/code&amp;gt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un graf orientat ponderat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri – în care fiecare arc are asociat un cost, număr natural strict pozitiv, și un nod &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;. Să se determine, folosind algoritmul lui Dijkstra, costul minim al drumului de la &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; la fiecare nod al grafului.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;dijkstraIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n p&amp;lt;/code&amp;gt;, iar următoarele linii câte un triplet &amp;lt;code&amp;gt;i j c&amp;lt;/code&amp;gt;, cu semnificația: există arcul &amp;lt;code&amp;gt;(i j)&amp;lt;/code&amp;gt; și are costul &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;dijkstraOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere, separate prin exact un spațiu, al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea număr reprezentând costul drumului minim de la &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Dacă nu există drum de la &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; la un anumit vârf, costul afișat va fi &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* costul unui arc va fi mai mic decât &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* costul unui drum este egal cu suma costurilor arcelor care îl compun&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstraIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 4&lt;br /&gt;
 1 3 1&lt;br /&gt;
 2 1 2&lt;br /&gt;
 4 2 1&lt;br /&gt;
 4 3 8&lt;br /&gt;
 5 3 5&lt;br /&gt;
 5 4 2&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstraOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 1 4 0 -1&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstraIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001 12&lt;br /&gt;
 1 3 1&lt;br /&gt;
 2 1 2&lt;br /&gt;
 4 2 1&lt;br /&gt;
 4 3 8&lt;br /&gt;
 5 3 5&lt;br /&gt;
 5 4 2&lt;br /&gt;
&amp;lt;code&amp;gt;dijkstraOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
import heapq&lt;br /&gt;
&lt;br /&gt;
def dijkstra(graph, start):&lt;br /&gt;
    n = len(graph)&lt;br /&gt;
    INF = float(&#039;inf&#039;)&lt;br /&gt;
    distante = [INF] * n&lt;br /&gt;
    distante[start] = 0&lt;br /&gt;
    heap = [(0, start)]&lt;br /&gt;
&lt;br /&gt;
    while heap:&lt;br /&gt;
        dist_curenta, nod_curent = heapq.heappop(heap)&lt;br /&gt;
&lt;br /&gt;
        if dist_curenta &amp;gt; distante[nod_curent]:&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        for vecin, cost in graph[nod_curent]:&lt;br /&gt;
            distanta_noua = dist_curenta + cost&lt;br /&gt;
            if distanta_noua &amp;lt; distante[vecin]:&lt;br /&gt;
                distante[vecin] = distanta_noua&lt;br /&gt;
                heapq.heappush(heap, (distanta_noua, vecin))&lt;br /&gt;
&lt;br /&gt;
    return distante&lt;br /&gt;
&lt;br /&gt;
def verificare_restrictii(n, graph):&lt;br /&gt;
    # Verificarea restrictiilor&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    for node_edges in graph:&lt;br /&gt;
        for _, cost in node_edges:&lt;br /&gt;
            if not (cost &amp;lt; 1000):&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def citeste_intrare(file_path):&lt;br /&gt;
    with open(file_path, &#039;r&#039;) as file:&lt;br /&gt;
        n, p = map(int, file.readline().split())&lt;br /&gt;
        &lt;br /&gt;
        # Verificare restrictii&lt;br /&gt;
        if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
            return n, p, None&lt;br /&gt;
&lt;br /&gt;
        graf = [[] for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
        for _ in range(n):&lt;br /&gt;
            i, j, c = map(int, file.readline().split())&lt;br /&gt;
            graf[i-1].append((j-1, c))&lt;br /&gt;
&lt;br /&gt;
    return n, p, graf&lt;br /&gt;
&lt;br /&gt;
def scrie_iesire(file_path, distante, restrictii_valide):&lt;br /&gt;
    with open(file_path, &#039;w&#039;) as file:&lt;br /&gt;
        if not restrictii_valide:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            for dist in distante:&lt;br /&gt;
                if dist == float(&#039;inf&#039;):&lt;br /&gt;
                    file.write(&amp;quot;-1 &amp;quot;)&lt;br /&gt;
                else:&lt;br /&gt;
                    file.write(str(dist) + &amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    fisier_intrare = &#039;dijkstraIN.txt&#039;&lt;br /&gt;
    fisier_iesire = &#039;dijkstraOUT.txt&#039;&lt;br /&gt;
&lt;br /&gt;
    n, p, graf = citeste_intrare(fisier_intrare)&lt;br /&gt;
&lt;br /&gt;
    # Verificare restricții&lt;br /&gt;
    restrictii_valide = verificare_restrictii(n, graf)&lt;br /&gt;
&lt;br /&gt;
    if not restrictii_valide:&lt;br /&gt;
        # Dacă restricțiile nu sunt respectate, scrie mesajul în fișierul de ieșire&lt;br /&gt;
        scrie_iesire(fisier_iesire, [], restrictii_valide)&lt;br /&gt;
    else:&lt;br /&gt;
        # Altfel, aplică algoritmul lui Dijkstra și scrie rezultatele în fișierul de ieșire&lt;br /&gt;
        distante = dijkstra(graf, p-1)&lt;br /&gt;
        scrie_iesire(fisier_iesire, distante, restrictii_valide)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0473_-_Bipartit_Complet&amp;diff=8573</id>
		<title>0473 - Bipartit Complet</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0473_-_Bipartit_Complet&amp;diff=8573"/>
		<updated>2023-12-27T14:57:07Z</updated>

		<summary type="html">&lt;p&gt;Simina: /* Date de ieşire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se consideră două mulţimi nevide &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;, cu proprietatea că formează o partiție a mulțimii &amp;lt;code&amp;gt;{1,2,...,n}.&amp;lt;/code&amp;gt; Să se construiască un graf bipartit complet cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri, bipartit peste partiţia formată din mulțimile &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;bipartitcompletIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Urmează un număr &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, apoi &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; numere naturale distincte cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, reprezentând vârfurile din &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;. Mulțimea &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; conține toate numerele naturale cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; care nu sunt în &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieşire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;bipartitcompletOUT.txt&amp;lt;/code&amp;gt; va conţine matricea de adiacență a grafului construit, câte o linie a matricei pe o linie a fișierului, elementele de pe o linie fiind separate prin exact un spațiu.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricţii şi precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; k  &amp;lt; n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;bipartitcompletIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 3 &lt;br /&gt;
 4 6 3&lt;br /&gt;
&amp;lt;code&amp;gt;bipartitcompletOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 0 1 1 0 1 0 &lt;br /&gt;
 0 0 1 1 0 1 0 &lt;br /&gt;
 1 1 0 0 1 0 1 &lt;br /&gt;
 1 1 0 0 1 0 1 &lt;br /&gt;
 0 0 1 1 0 1 0 &lt;br /&gt;
 1 1 0 0 1 0 1 &lt;br /&gt;
 0 0 1 1 0 1 0 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 : =&lt;br /&gt;
&amp;lt;code&amp;gt;bipartitcompletIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001&lt;br /&gt;
 3 &lt;br /&gt;
 4 6 3&lt;br /&gt;
&amp;lt;code&amp;gt;bipartitcompletOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(k, n):&lt;br /&gt;
    if not (1 &amp;lt; k &amp;lt; n &amp;lt;= 100):&lt;br /&gt;
        with open(&amp;quot;bipartitcompletOUT.txt&amp;quot;, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def construieste_graf(n, A):&lt;br /&gt;
    # Inițializăm matricea de adiacență cu zerouri&lt;br /&gt;
    graf = [[0] * n for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    # Marcam conexiunile dintre vârfurile din A și B&lt;br /&gt;
    for i in A:&lt;br /&gt;
        for j in range(1, n + 1):&lt;br /&gt;
            if j not in A:&lt;br /&gt;
                graf[i - 1][j - 1] = 1&lt;br /&gt;
                graf[j - 1][i - 1] = 1  # Adăugăm și conexiunea inversă&lt;br /&gt;
&lt;br /&gt;
    return graf&lt;br /&gt;
&lt;br /&gt;
def scrie_matrice_in_fisier(matrice, nume_fisier):&lt;br /&gt;
    with open(nume_fisier, &#039;w&#039;) as f:&lt;br /&gt;
        for linie in matrice:&lt;br /&gt;
            f.write(&#039; &#039;.join(map(str, linie)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # Citim datele de intrare din fișier&lt;br /&gt;
    with open(&amp;quot;bipartitcompletIN.txt&amp;quot;, &#039;r&#039;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
        k = int(f.readline().strip())&lt;br /&gt;
        A = list(map(int, f.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verificăm restricțiile&lt;br /&gt;
    if not verifica_restrictii(k, n):&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
    # Construim graful bipartit&lt;br /&gt;
    graf = construieste_graf(n, A)&lt;br /&gt;
&lt;br /&gt;
    # Scriem matricea de adiacență în fișierul de ieșire&lt;br /&gt;
    scrie_matrice_in_fisier(graf, &amp;quot;bipartitcompletOUT.txt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1651_-_Graf&amp;diff=8572</id>
		<title>1651 - Graf</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1651_-_Graf&amp;diff=8572"/>
		<updated>2023-12-27T14:56:52Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat ponderat. Să se determine vârful pentru care media aritmetică a ponderilor muchiilor incidente este minimă. Dacă există mai multe vârfuri cu aceeași medie minimă, se va afișa vârful numerotat cu o valoare mai mică.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numerele &amp;lt;code&amp;gt;n m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri și numărul de muchii din graf, apoi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; triplete &amp;lt;code&amp;gt;i j p&amp;lt;/code&amp;gt;, reprezentând muchiile, date prin extremități și pondere.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul &amp;lt;code&amp;gt;vf&amp;lt;/code&amp;gt;, reprezentând vârful determinat.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* ponderile muchiilor sunt numere naturale nenule mai mici decât &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* graful dat nu conține noduri izolate&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5 6&lt;br /&gt;
 1 2 10&lt;br /&gt;
 2 3 2&lt;br /&gt;
 2 5 2&lt;br /&gt;
 3 5 12&lt;br /&gt;
 3 4 1&lt;br /&gt;
 4 5 5&lt;br /&gt;
Ieșire&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Mediile ponderilor muchiilor incidente cu vârfurile grafului sunt:&lt;br /&gt;
&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;4.66667&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;6.33333&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Astfel media minimă este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, pentru vârful &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;Intrare&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;101&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;consola&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restricții(n, m, muchii):&lt;br /&gt;
    # Verificăm restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or any(not (1 &amp;lt;= vf1 &amp;lt;= n and 1 &amp;lt;= vf2 &amp;lt;= n) for vf1, vf2, _ in muchii) or any(not (1 &amp;lt;= p &amp;lt; 1000) for _, _, p in muchii):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def gaseste_varf_minim_media_ponderilor(n, m, muchii):&lt;br /&gt;
    # Initializăm un dicționar pentru a stoca ponderile muchiilor incidente pentru fiecare vârf&lt;br /&gt;
    ponderi_vf = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
&lt;br /&gt;
    # Citim și memorăm ponderile muchiilor în dicționar&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        vf1, vf2, pondera = muchii[i]&lt;br /&gt;
        ponderi_vf[vf1].append(pondera)&lt;br /&gt;
        ponderi_vf[vf2].append(pondera)&lt;br /&gt;
&lt;br /&gt;
    # Calculăm media aritmetică a ponderilor pentru fiecare vârf&lt;br /&gt;
    medii_ponderi = {vf: sum(ponderi) / len(ponderi) for vf, ponderi in ponderi_vf.items()}&lt;br /&gt;
&lt;br /&gt;
    # Găsim vârful cu media minimă&lt;br /&gt;
    vf_min_media = min(medii_ponderi, key=medii_ponderi.get)&lt;br /&gt;
&lt;br /&gt;
    return vf_min_media&lt;br /&gt;
&lt;br /&gt;
# Citirea numărului de vârfuri&lt;br /&gt;
n = int(input(&amp;quot;Introduceți numărul de vârfuri &amp;quot;))&lt;br /&gt;
if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
    print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
else:&lt;br /&gt;
    # Citirea numărului de muchii&lt;br /&gt;
    m = int(input(&amp;quot;Introduceți numărul de muchii: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    # Citirea muchiilor și ponderilor&lt;br /&gt;
    print(&amp;quot;Introduceți extremitățile și ponderea fiecărei muchii:&amp;quot;)&lt;br /&gt;
    muchii = [tuple(map(int, input().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    # Apelarea funcției și afișarea rezultatului&lt;br /&gt;
    rezultat = gaseste_varf_minim_media_ponderilor(n, m, muchii)&lt;br /&gt;
    if rezultat is not None:&lt;br /&gt;
        print(rezultat)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3693_%E2%80%93_Binary_Tree&amp;diff=8571</id>
		<title>3693 – Binary Tree</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3693_%E2%80%93_Binary_Tree&amp;diff=8571"/>
		<updated>2023-12-27T14:56:42Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Un arbore binar complet este un arbore binar în care toate nivelurile, cu excepția ultimului sunt ocupate în întregime. În general, deși nu este obligatoriu, toate nodurile de pe ultimul nivel sunt grupate în partea stânga a acestuia.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dau un arbore binar complet infinit cu rădăcina în nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; în care pentru orice nod &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; copiii săi sunt nodurile &amp;lt;code&amp;gt;2*i&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;2*i+1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; perechi de numere &amp;lt;code&amp;gt;u v&amp;lt;/code&amp;gt;. Se cere să se afle pentru fiecare pereche lungimea cel mai scurt drum(ca număr de muchii) dintre nodurile &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; din arbore.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numărul &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;, iar apoi &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; perechi de numere naturale, fiecare pereche pe câte o linie.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran pentru fiecare pereche &amp;lt;code&amp;gt;u v&amp;lt;/code&amp;gt; distanța dintre nodurile &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; din arbore.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ u, v ≤ 2.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5&lt;br /&gt;
 1 2&lt;br /&gt;
 4 5&lt;br /&gt;
 8 15&lt;br /&gt;
 11 3&lt;br /&gt;
 12 14&lt;br /&gt;
Ieșire&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 6&lt;br /&gt;
 4&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Așa arată primele &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; nivele ale arborelui descris în enunț:&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 100000000&lt;br /&gt;
Consola&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare_restrictii(Q, u, v):&lt;br /&gt;
    if not (1 &amp;lt;= Q &amp;lt;= 100000) or not (1 &amp;lt;= u &amp;lt;= 2000000000) or not (1 &amp;lt;= v &amp;lt;= 2000000000) or u &amp;lt; 0 or v &amp;lt; 0:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
def gaseste_distanta(u, v):&lt;br /&gt;
    # Funcție pentru a găsi distanța dintre două noduri în arborele binar complet&lt;br /&gt;
    distanta = 0&lt;br /&gt;
    while u != v:&lt;br /&gt;
        # Asigurăm că u este întotdeauna mai mic sau egal decât v&lt;br /&gt;
        if u &amp;gt; v:&lt;br /&gt;
            u, v = v, u&lt;br /&gt;
        v //= 2  # Urmează căutarea pe nivelul anterior pentru v&lt;br /&gt;
        distanta += 1&lt;br /&gt;
&lt;br /&gt;
    return distanta&lt;br /&gt;
&lt;br /&gt;
# Citim numărul de perechi&lt;br /&gt;
Q = int(input(&amp;quot;Introdu numărul de perechi (Q): &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
# Verificăm restricțiile pentru Q&lt;br /&gt;
verificare_restrictii(Q, Q, Q)&lt;br /&gt;
&lt;br /&gt;
valori_u = []&lt;br /&gt;
valori_v = []&lt;br /&gt;
&lt;br /&gt;
# Citim și procesăm fiecare pereche&lt;br /&gt;
for _ in range(Q):&lt;br /&gt;
    u, v = map(int, input(&amp;quot;Introdu perechea u v: &amp;quot;).split())&lt;br /&gt;
    valori_u.append(u)&lt;br /&gt;
    valori_v.append(v)&lt;br /&gt;
&lt;br /&gt;
# Verificăm restricțiile pentru u și v&lt;br /&gt;
verificare_restrictii(Q, max(valori_u), max(valori_v))&lt;br /&gt;
&lt;br /&gt;
# Afișăm rezultatele la final&lt;br /&gt;
print(&amp;quot;\nRezultate:&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for u, v in zip(valori_u, valori_v):&lt;br /&gt;
    distanta = gaseste_distanta(u, v)&lt;br /&gt;
    print(f&amp;quot;{distanta}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0647_%E2%80%93_Subarbore2&amp;diff=8570</id>
		<title>0647 – Subarbore2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0647_%E2%80%93_Subarbore2&amp;diff=8570"/>
		<updated>2023-12-27T14:56:35Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Fiecare nod al arborelui are asociată o valoare numerică întreagă. Determinați suma valorilor asociate nodurilor din subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;subarbore2IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe a doua linie se află vectorul de tați al arborelui, valorile fiind separate prin spații. Pe linia a treia se află, în ordine, valorile asociate nodurilor din arbore.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;subarbore2OUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie valoarea cerută.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* valorile asociate nodurilor din arbore sunt numere întregi din intervalul &amp;lt;code&amp;gt;[-1000,1000]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarbore2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8 4&lt;br /&gt;
 4 3 0 3 2 1 4 1&lt;br /&gt;
 -3 -2 4 4 0 -3 3 2 &lt;br /&gt;
&amp;lt;code&amp;gt;subarbore2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarbore2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 2&lt;br /&gt;
 4 3 0 3 2 1 4 1&lt;br /&gt;
 -3 -2 4 4 0 -3 3 2 &lt;br /&gt;
&amp;lt;code&amp;gt;subarbore2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare_restrictii(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not (1 &amp;lt;= k &amp;lt;= n):&lt;br /&gt;
        with open(&#039;subarbore2OUT.txt&#039;, &#039;w&#039;) as fisier_iesire:&lt;br /&gt;
            fisier_iesire.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dfs(nod, lista_adiacenta, valori):&lt;br /&gt;
    suma_subarbore = valori[nod - 1]  # Corectarea indexării pentru a evita IndexError&lt;br /&gt;
    for copil in lista_adiacenta[nod]:&lt;br /&gt;
        suma_subarbore += dfs(copil, lista_adiacenta, valori)&lt;br /&gt;
    return suma_subarbore&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    with open(&#039;subarbore2IN.txt&#039;, &#039;r&#039;) as fisier:&lt;br /&gt;
        n, k = map(int, fisier.readline().split())&lt;br /&gt;
&lt;br /&gt;
    # Verificarea restricțiilor&lt;br /&gt;
    if not verificare_restrictii(n, k):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Citirea celorlalte date de intrare&lt;br /&gt;
    with open(&#039;subarbore2IN.txt&#039;, &#039;r&#039;) as fisier:&lt;br /&gt;
        fisier.readline()  # Trecem peste linia cu n și k&lt;br /&gt;
        parinti = list(map(int, fisier.readline().split()))&lt;br /&gt;
        valori = list(map(int, fisier.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Construirea listei de adiacență&lt;br /&gt;
    lista_adiacenta = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if parinti[i] != 0:&lt;br /&gt;
            lista_adiacenta[parinti[i]].append(i + 1)&lt;br /&gt;
&lt;br /&gt;
    # Calcularea sumei valorilor asociate nodurilor din subarborele cu rădăcina în k&lt;br /&gt;
    rezultat = dfs(k, lista_adiacenta, valori)&lt;br /&gt;
&lt;br /&gt;
    # Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
    with open(&#039;subarbore2OUT.txt&#039;, &#039;w&#039;) as fisier_iesire:&lt;br /&gt;
        fisier_iesire.write(str(rezultat))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0649_%E2%80%93_Subarbori&amp;diff=8569</id>
		<title>0649 – Subarbori</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0649_%E2%80%93_Subarbori&amp;diff=8569"/>
		<updated>2023-12-27T14:56:26Z</updated>

		<summary type="html">&lt;p&gt;Simina: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați câte perechi de noduri neterminale distincte &amp;lt;code&amp;gt;p q&amp;lt;/code&amp;gt; din arbore au proprietatea că subarborele cu rădăcina în &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și cel cu rădăcina în &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; au același număr de noduri.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;subarboriIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;subarboriOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie valoarea cerută.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarboriIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;subarboriOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Singura pereche de noduri neterminale pentru care subarborii au același număr de noduri este &amp;lt;code&amp;gt;2 1&amp;lt;/code&amp;gt;. Subarborii cu rădăcina în &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; au câte &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; noduri fiecare.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;subarboriIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;subarboriOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
class NodArbore:&lt;br /&gt;
    def __init__(self, valoare):&lt;br /&gt;
        self.valoare = valoare&lt;br /&gt;
        self.copii = []&lt;br /&gt;
&lt;br /&gt;
def construieste_arbore(tati):&lt;br /&gt;
    noduri = [NodArbore(i) for i in range(len(tati))]&lt;br /&gt;
    &lt;br /&gt;
    for i, tata in enumerate(tati):&lt;br /&gt;
        if tata != 0:&lt;br /&gt;
            noduri[tata - 1].copii.append(noduri[i])&lt;br /&gt;
    &lt;br /&gt;
    return noduri[0]  # returnează rădăcina arborelui&lt;br /&gt;
&lt;br /&gt;
def numara_subarbori_cu_acelasi_numar_de_noduri(nod):&lt;br /&gt;
    if not nod.copii:&lt;br /&gt;
        return 1, {1: 1}  # tuplu: (număr de noduri, dicționar cu numărul de subarbori de acea dimensiune)&lt;br /&gt;
    &lt;br /&gt;
    total_noduri = 1&lt;br /&gt;
    dimensiuni_subarbori = {}&lt;br /&gt;
    &lt;br /&gt;
    for copil in nod.copii:&lt;br /&gt;
        dimensiune_copil, dimensiuni_subarbori_copil = numara_subarbori_cu_acelasi_numar_de_noduri(copil)&lt;br /&gt;
        total_noduri += dimensiune_copil&lt;br /&gt;
        &lt;br /&gt;
        for dimensiune, numar in dimensiuni_subarbori_copil.items():&lt;br /&gt;
            dimensiuni_subarbori[dimensiune] = dimensiuni_subarbori.get(dimensiune, 0) + numar&lt;br /&gt;
        &lt;br /&gt;
    dimensiuni_subarbori[total_noduri] = dimensiuni_subarbori.get(total_noduri, 0) + 1&lt;br /&gt;
    &lt;br /&gt;
    return total_noduri, dimensiuni_subarbori&lt;br /&gt;
&lt;br /&gt;
def verificare_restricții(n):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        with open(&amp;quot;subarboriOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
            fisier_iesire.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;subarboriIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fisier_intrare:&lt;br /&gt;
        n = int(fisier_intrare.readline().strip())&lt;br /&gt;
        verificare_restricții(n)&lt;br /&gt;
        tati = list(map(int, fisier_intrare.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
    radacina = construieste_arbore(tati)&lt;br /&gt;
    _, dimensiuni_subarbori = numara_subarbori_cu_acelasi_numar_de_noduri(radacina)&lt;br /&gt;
    &lt;br /&gt;
    rezultat = sum(numar * (numar - 1) // 2 for numar in dimensiuni_subarbori.values())&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;subarboriOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
        fisier_iesire.write(str(rezultat))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0646_%E2%80%93_Subarbore1&amp;diff=8568</id>
		<title>0646 – Subarbore1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0646_%E2%80%93_Subarbore1&amp;diff=8568"/>
		<updated>2023-12-27T14:56:15Z</updated>

		<summary type="html">&lt;p&gt;Simina: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Afișați, în ordine crescătoare, nodurile terminale din subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;subarbore1IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;subarbore1OUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie nodurile terminale din subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, în ordine crescătoare, separate printr-un spațiu.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarbore1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8 4&lt;br /&gt;
 4 3 0 3 2 1 4 1&lt;br /&gt;
&amp;lt;code&amp;gt;subarbore1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 7 8&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarbore1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 2&lt;br /&gt;
 4 3 0 3 2 1 4 1&lt;br /&gt;
&amp;lt;code&amp;gt;subarbore1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def dfs(nod, lista_adiacenta, rezultat):&lt;br /&gt;
    # Verificăm dacă nodul este terminal&lt;br /&gt;
    if nod not in lista_adiacenta:&lt;br /&gt;
        rezultat.append(nod)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Parcurgem vecinii nodului și aplicăm DFS pe fiecare dintre ei&lt;br /&gt;
    for vecin in lista_adiacenta[nod]:&lt;br /&gt;
        dfs(vecin, lista_adiacenta, rezultat)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100 and 1 &amp;lt;= k &amp;lt;= n):&lt;br /&gt;
        with open(&amp;quot;subarbore1OUT.txt&amp;quot;, &#039;w&#039;) as fisier:&lt;br /&gt;
            fisier.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
def main(fisier_intrare, fisier_iesire):&lt;br /&gt;
    with open(fisier_intrare, &#039;r&#039;) as fisier:&lt;br /&gt;
        # Citim numărul de noduri și nodul k&lt;br /&gt;
        n, k = map(int, fisier.readline().split())&lt;br /&gt;
&lt;br /&gt;
        # Verificăm dacă restricțiile sunt respectate&lt;br /&gt;
        verifica_restrictii(n, k)&lt;br /&gt;
        &lt;br /&gt;
        # Citim vectorul de tați al arborelui&lt;br /&gt;
        tati = list(map(int, fisier.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Construim o listă de adiacență bazată pe vectorul de tați&lt;br /&gt;
    lista_adiacenta = {}&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        parinte = tati[i]&lt;br /&gt;
        if parinte not in lista_adiacenta:&lt;br /&gt;
            lista_adiacenta[parinte] = []&lt;br /&gt;
        lista_adiacenta[parinte].append(i + 1)  # Adăugăm nodul curent ca fiu al nodului părinte&lt;br /&gt;
&lt;br /&gt;
    # Aplicăm DFS pentru a identifica nodurile terminale din subarborele cu rădăcina în nodul k&lt;br /&gt;
    rezultat = []&lt;br /&gt;
    dfs(k, lista_adiacenta, rezultat)&lt;br /&gt;
&lt;br /&gt;
    # Scriem rezultatul în fișierul de ieșire&lt;br /&gt;
    with open(fisier_iesire, &#039;w&#039;) as fisier:&lt;br /&gt;
        if not rezultat:&lt;br /&gt;
            fisier.write(&amp;quot;Subarborele nu are noduri terminale&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            fisier.write(&#039; &#039;.join(map(str, sorted(rezultat))))&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
main(&amp;quot;subarbore1IN.txt&amp;quot;, &amp;quot;subarbore1OUT.txt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0648_%E2%80%93_Subarbore_Num%C4%83rare&amp;diff=8567</id>
		<title>0648 – Subarbore Numărare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0648_%E2%80%93_Subarbore_Num%C4%83rare&amp;diff=8567"/>
		<updated>2023-12-27T14:56:03Z</updated>

		<summary type="html">&lt;p&gt;Simina: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Determinați câte noduri conține subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;subarborenumarareIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;subarborenumarareOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie valoarea cerută.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarborenumarareIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8 4&lt;br /&gt;
 4 3 0 3 2 1 4 1&lt;br /&gt;
&amp;lt;code&amp;gt;subarborenumarareOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarborenumarareIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 2&lt;br /&gt;
 4 3 0 3 2 1 4 1&lt;br /&gt;
&amp;lt;code&amp;gt;subarborenumarareOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def numara_noduri_subarbore(n, k, vector_tati):&lt;br /&gt;
    relatii = {}&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        parinte = vector_tati[i - 1]&lt;br /&gt;
        if parinte not in relatii:&lt;br /&gt;
            relatii[parinte] = []&lt;br /&gt;
        relatii[parinte].append(i)&lt;br /&gt;
&lt;br /&gt;
    def numara_noduri_recursiv(nod):&lt;br /&gt;
        numar_noduri = 1&lt;br /&gt;
        if nod in relatii:&lt;br /&gt;
            for copil in relatii[nod]:&lt;br /&gt;
                numar_noduri += numara_noduri_recursiv(copil)&lt;br /&gt;
        return numar_noduri&lt;br /&gt;
&lt;br /&gt;
    rezultat = numara_noduri_recursiv(k)&lt;br /&gt;
&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
def verificare_restricții(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100 and 1 &amp;lt;= k &amp;lt;= n):&lt;br /&gt;
        with open(&amp;quot;subarborenumarareOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
# Citire date de intrare&lt;br /&gt;
with open(&amp;quot;subarborenumarareIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
    n, k = map(int, f.readline().split())&lt;br /&gt;
    vector_tati = list(map(int, f.readline().split()))&lt;br /&gt;
&lt;br /&gt;
# Verificare restricții&lt;br /&gt;
if verificare_restricții(n, k):&lt;br /&gt;
    # Calcul și scriere rezultat în fișierul de ieșire&lt;br /&gt;
    rezultat = numara_noduri_subarbore(n, k, vector_tati)&lt;br /&gt;
    with open(&amp;quot;subarborenumarareOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(rezultat))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0641_%E2%80%93_Subarbore&amp;diff=8566</id>
		<title>0641 – Subarbore</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0641_%E2%80%93_Subarbore&amp;diff=8566"/>
		<updated>2023-12-27T14:55:51Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Afișați, în ordine crescătoare, nodurile din subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;subarboreIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;subarboreOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie nodurile din subarbore, în ordine crescătoare, separate printr-un spațiu.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarboreIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 7&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;subarboreOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 5 6 7&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarboreIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 2&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;subarboreOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100 and 1 &amp;lt;= k &amp;lt;= n):&lt;br /&gt;
        with open(&amp;quot;subarboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
            outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dfs(nod, lista_adiacenta, noduri_subarbore):&lt;br /&gt;
    noduri_subarbore.append(nod)&lt;br /&gt;
    for copil in lista_adiacenta[nod]:&lt;br /&gt;
        dfs(copil, lista_adiacenta, noduri_subarbore)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    with open(&amp;quot;subarboreIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as infile:&lt;br /&gt;
        n, k = map(int, infile.readline().split())&lt;br /&gt;
        parinti = list(map(int, infile.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verificarea restricțiilor&lt;br /&gt;
    if not verifica_restrictii(n, k):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Construirea listei de adiacență bazată pe vectorul de tați&lt;br /&gt;
    lista_adiacenta = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if parinti[i - 1] != 0:&lt;br /&gt;
            lista_adiacenta[parinti[i - 1]].append(i)&lt;br /&gt;
&lt;br /&gt;
    # Identificarea și colectarea nodurilor din subarbore&lt;br /&gt;
    noduri_subarbore = []&lt;br /&gt;
    dfs(k, lista_adiacenta, noduri_subarbore)&lt;br /&gt;
&lt;br /&gt;
    # Sortarea și scrierea rezultatelor în fișierul de ieșire&lt;br /&gt;
    noduri_subarbore.sort()&lt;br /&gt;
    with open(&amp;quot;subarboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
        outfile.write(&amp;quot; &amp;quot;.join(map(str, noduri_subarbore)))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0640_%E2%80%93_NrFii&amp;diff=8565</id>
		<title>0640 – NrFii</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0640_%E2%80%93_NrFii&amp;diff=8565"/>
		<updated>2023-12-27T14:55:38Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați nodul din arbore cu număr maxim de fii. Dacă în arbore sunt mai multe noduri cu număr maxim de fii, afișați-le pe toate, în ordine crescătoare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;nrfiiIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;nrfiiOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie nodurile din arbore cu număr maxim de fii, în ordine crescătoare, separate printr-un spațiu.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citeste_arbore(file_path):&lt;br /&gt;
    with open(file_path, &#039;r&#039;) as file:&lt;br /&gt;
        n = int(file.readline().strip())&lt;br /&gt;
        tati = list(map(int, file.readline().split()))&lt;br /&gt;
    return n, tati&lt;br /&gt;
&lt;br /&gt;
def verificare_restrictii(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 100:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        with open(&amp;quot;nrfiiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
            file_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def determina_noduri_max_fii(n, tati):&lt;br /&gt;
    fii = [0] * (n + 1)&lt;br /&gt;
    for tata in tati:&lt;br /&gt;
        if tata != -1:&lt;br /&gt;
            fii[tata] += 1&lt;br /&gt;
&lt;br /&gt;
    max_fii = max(fii)&lt;br /&gt;
    noduri_max_fii = [i for i in range(1, n + 1) if fii[i] == max_fii]&lt;br /&gt;
&lt;br /&gt;
    return noduri_max_fii&lt;br /&gt;
&lt;br /&gt;
def scrie_rezultat(file_path, noduri_max_fii):&lt;br /&gt;
    with open(file_path, &#039;w&#039;) as file:&lt;br /&gt;
        if noduri_max_fii:&lt;br /&gt;
            file.write(&#039; &#039;.join(map(str, noduri_max_fii)))&lt;br /&gt;
        else:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    file_input = &amp;quot;nrfiiIN.txt&amp;quot;&lt;br /&gt;
    file_output = &amp;quot;nrfiiOUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    n, tati = citeste_arbore(file_input)&lt;br /&gt;
&lt;br /&gt;
    if verificare_restrictii(n):&lt;br /&gt;
        noduri_max_fii = determina_noduri_max_fii(n, tati)&lt;br /&gt;
        scrie_rezultat(file_output, noduri_max_fii)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;nrfiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;nrfiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Nodul &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; are număr maxim de fii, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;nrfiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;nrfiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0650_%E2%80%93_kNivel&amp;diff=8564</id>
		<title>0650 – kNivel</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0650_%E2%80%93_kNivel&amp;diff=8564"/>
		<updated>2023-12-27T14:55:26Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și o valoare &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Determinați nodurile situate pe nivelul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; în arbore.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;knivelIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și valoarea &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;knivelOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie, în ordine crescătoare, nodurile situate pe nivelul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; în arbore.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* pe nivelul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; va exista cel puțin un nod&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;knivelIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8 3&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;knivelOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 5 7&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;knivelIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 2&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;knivelOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare_restrictii(n, k):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 100:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def gaseste_noduri_pe_nivel(tati, nivel):&lt;br /&gt;
    noduri_pe_nivel = []&lt;br /&gt;
    for i in range(len(tati)):&lt;br /&gt;
        nivel_nod_curent = 1  # Nivelul rădăcinii&lt;br /&gt;
        parinte_curent = tati[i]&lt;br /&gt;
&lt;br /&gt;
        while parinte_curent != 0:&lt;br /&gt;
            parinte_curent = tati[parinte_curent - 1]&lt;br /&gt;
            nivel_nod_curent += 1&lt;br /&gt;
&lt;br /&gt;
        if nivel_nod_curent == nivel:&lt;br /&gt;
            noduri_pe_nivel.append(i + 1)&lt;br /&gt;
&lt;br /&gt;
    return noduri_pe_nivel&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare din fișier&lt;br /&gt;
    with open(&amp;quot;knivelIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fisier_intrare:&lt;br /&gt;
        n, k = map(int, fisier_intrare.readline().split())&lt;br /&gt;
        tati = list(map(int, fisier_intrare.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verificarea restricțiilor&lt;br /&gt;
    if not verificare_restrictii(n, k):&lt;br /&gt;
        with open(&amp;quot;knivelOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
            fisier_iesire.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Găsirea nodurilor de pe nivelul k&lt;br /&gt;
    noduri_pe_nivel_k = gaseste_noduri_pe_nivel(tati, k)&lt;br /&gt;
&lt;br /&gt;
    # Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;knivelOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
        if noduri_pe_nivel_k:&lt;br /&gt;
            fisier_iesire.write(&amp;quot; &amp;quot;.join(map(str, noduri_pe_nivel_k)))&lt;br /&gt;
        else:&lt;br /&gt;
            fisier_iesire.write(&amp;quot;Nu există noduri pe nivelul specificat&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4159_%E2%80%93_Nivele11&amp;diff=8563</id>
		<title>4159 – Nivele11</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4159_%E2%80%93_Nivele11&amp;diff=8563"/>
		<updated>2023-12-27T14:55:14Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Î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 &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Afișați parcurgerea pe nivele a arborelui dat.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;nivele11IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;nivele11OUT.txt&amp;lt;/code&amp;gt; va conține mai multe linii. Fiecare linie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; conține, în ordine crescătoare, nodurile aflate pe nivelul &amp;lt;code&amp;gt;i-1&amp;lt;/code&amp;gt;, separate prin câte un epațiu.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;nivele11IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;nivele11OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 &lt;br /&gt;
 2 4 &lt;br /&gt;
 1 5 7 &lt;br /&gt;
 6 8 &lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;nivele11IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;nivele11OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict, deque&lt;br /&gt;
&lt;br /&gt;
def verificare_restrictii(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 100:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        with open(&#039;nivele11OUT.txt&#039;, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def parcurgere_pe_nivele(n, tati):&lt;br /&gt;
    if not verificare_restrictii(n):&lt;br /&gt;
        return []&lt;br /&gt;
&lt;br /&gt;
    # Construim lista de adiacență pentru arbore&lt;br /&gt;
    graf = defaultdict(list)&lt;br /&gt;
    radacina = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        parinte = tati[i]&lt;br /&gt;
&lt;br /&gt;
        if parinte == 0:&lt;br /&gt;
            radacina = i + 1&lt;br /&gt;
        else:&lt;br /&gt;
            graf[parinte].append(i + 1)&lt;br /&gt;
&lt;br /&gt;
    # Folosim BFS pentru a parcurge nodurile pe nivele&lt;br /&gt;
    nivele = []&lt;br /&gt;
    vizitat = [False] * (n + 1)&lt;br /&gt;
    queue = deque([(radacina, 0)])  # Rădăcina se află pe nivelul 0&lt;br /&gt;
&lt;br /&gt;
    while queue:&lt;br /&gt;
        nod, nivel = queue.popleft()&lt;br /&gt;
        if not vizitat[nod]:&lt;br /&gt;
            vizitat[nod] = True&lt;br /&gt;
&lt;br /&gt;
            # Adăugăm nodul la lista corespunzătoare nivelului său&lt;br /&gt;
            if len(nivele) &amp;lt;= nivel:&lt;br /&gt;
                nivele.append([])&lt;br /&gt;
            nivele[nivel].append(nod)&lt;br /&gt;
&lt;br /&gt;
            # Adăugăm fiii nodului în coadă cu nivelul actual + 1&lt;br /&gt;
            for fiu in graf[nod]:&lt;br /&gt;
                if not vizitat[fiu]:&lt;br /&gt;
                    queue.append((fiu, nivel + 1))&lt;br /&gt;
&lt;br /&gt;
    return nivele&lt;br /&gt;
&lt;br /&gt;
# Citim datele din fișierul de intrare&lt;br /&gt;
with open(&#039;nivele11IN.txt&#039;, &#039;r&#039;) as file:&lt;br /&gt;
    n = int(file.readline().strip())&lt;br /&gt;
    tati = list(map(int, file.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
# Obținem rezultatul&lt;br /&gt;
rezultat = parcurgere_pe_nivele(n, tati)&lt;br /&gt;
&lt;br /&gt;
# Dacă rezultatul nu este gol, scriem rezultatul în fișierul de ieșire&lt;br /&gt;
if rezultat:&lt;br /&gt;
    with open(&#039;nivele11OUT.txt&#039;, &#039;w&#039;) as file:&lt;br /&gt;
        for nivel in rezultat:&lt;br /&gt;
            file.write(&#039; &#039;.join(map(str, nivel)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4156_%E2%80%93_Nivele_Pare&amp;diff=8562</id>
		<title>4156 – Nivele Pare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4156_%E2%80%93_Nivele_Pare&amp;diff=8562"/>
		<updated>2023-12-27T14:55:03Z</updated>

		<summary type="html">&lt;p&gt;Simina: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Într-un arbore cu rădăcină, nivelul unui nod este lungimea lanțului de la rădăcină la acel nod. Astfel, rădăcina este pe nivelul &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați nodurile situate pe nivele pare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;nivelepareIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;nivelepareOUT.txt&amp;lt;/code&amp;gt; va conține mai multe linii. Fiecare linie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; conține, în ordine crescătoare, nodurile aflate pe nivelul &amp;lt;code&amp;gt;2*(i-1)&amp;lt;/code&amp;gt;.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;nivelepareIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;nivelepareOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 1 5 7&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;nivelepareIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;nivelepareOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 100:&lt;br /&gt;
        return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def citeste_arbore_din_fisier(file_path):&lt;br /&gt;
    with open(file_path, &#039;r&#039;) as file:&lt;br /&gt;
        n = int(file.readline())&lt;br /&gt;
        if not verifica_restrictii(n):&lt;br /&gt;
            return None, None, &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
        parinti = list(map(int, file.readline().split()))&lt;br /&gt;
    return n, parinti, None&lt;br /&gt;
&lt;br /&gt;
def scrie_noduri_pe_nivele_pare(file_path, nivele_pare):&lt;br /&gt;
    with open(file_path, &#039;w&#039;) as file:&lt;br /&gt;
        for nivel in nivele_pare:&lt;br /&gt;
            file.write(&#039; &#039;.join(map(str, nivel)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def noduri_pe_nivele_pare(n, parinti):&lt;br /&gt;
    nivele_pare = [[] for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        parinte = parinti[i]&lt;br /&gt;
        nivel = 0&lt;br /&gt;
        while parinte != 0:&lt;br /&gt;
            nivel += 1&lt;br /&gt;
            parinte = parinti[parinte - 1]&lt;br /&gt;
&lt;br /&gt;
        if nivel % 2 == 0:&lt;br /&gt;
            nivele_pare[nivel // 2].append(i + 1)&lt;br /&gt;
&lt;br /&gt;
    return nivele_pare&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    input_file = &amp;quot;nivelepareIN.txt&amp;quot;&lt;br /&gt;
    output_file = &amp;quot;nivelepareOUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    n, parinti, restrictii_msg = citeste_arbore_din_fisier(input_file)&lt;br /&gt;
&lt;br /&gt;
    if restrictii_msg:&lt;br /&gt;
        with open(output_file, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(restrictii_msg)&lt;br /&gt;
    else:&lt;br /&gt;
        nivele_pare = noduri_pe_nivele_pare(n, parinti)&lt;br /&gt;
        scrie_noduri_pe_nivele_pare(output_file, nivele_pare)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0639_%E2%80%93_%C3%8En%C4%83l%C8%9Bime&amp;diff=8561</id>
		<title>0639 – Înălțime</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0639_%E2%80%93_%C3%8En%C4%83l%C8%9Bime&amp;diff=8561"/>
		<updated>2023-12-27T14:54:52Z</updated>

		<summary type="html">&lt;p&gt;Simina: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, etc. Numărul de nivele distincte din arbore determină înălțimea arborelui.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați înălțimea arborelui.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;inaltimeIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;inaltimeOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; , reprezentând înălțimea arborelui.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;inaltimeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;inaltimeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
= Exemplu 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;inaltimeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;inaltimeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 100:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        with open(&amp;quot;inaltimeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def calculeaza_inaltimea(n, tati):&lt;br /&gt;
    if not verifica_restrictii(n):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    inaltime = 0&lt;br /&gt;
    nivele = [0] * n&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        nivel = 0&lt;br /&gt;
        j = i&lt;br /&gt;
        while tati[j] != 0:&lt;br /&gt;
            nivel += 1&lt;br /&gt;
            j = tati[j] - 1&lt;br /&gt;
            if nivele[j] != 0:&lt;br /&gt;
                nivel += nivele[j]&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
        nivele[i] = nivel&lt;br /&gt;
        inaltime = max(inaltime, nivel + 1)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;inaltimeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
        file.write(str(inaltime))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    with open(&amp;quot;inaltimeIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        n = int(file.readline())&lt;br /&gt;
        if not verifica_restrictii(n):&lt;br /&gt;
            return&lt;br /&gt;
        tati = list(map(int, file.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Calcularea inaltimii arborelui&lt;br /&gt;
    calculeaza_inaltimea(n, tati)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2749_%E2%80%93_Tat%C4%83&amp;diff=8560</id>
		<title>2749 – Tată</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2749_%E2%80%93_Tat%C4%83&amp;diff=8560"/>
		<updated>2023-12-27T14:54:43Z</updated>

		<summary type="html">&lt;p&gt;Simina: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un vector &amp;lt;code&amp;gt;t=(t[1], t[2], ..., t[n])&amp;lt;/code&amp;gt; care memorează numere naturale cuprinse între &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Să se verifice dacă &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; este sau nu vector de tați asociat unui arbore cu rădăcină.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar apoi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran mesajul &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;, dacă &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; este vector de tați, sau mesajul &amp;lt;code&amp;gt;NU&amp;lt;/code&amp;gt; în caz contrar.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ t[i] ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5&lt;br /&gt;
 0 1 1 3 3&lt;br /&gt;
Ieșire&lt;br /&gt;
 DA&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5&lt;br /&gt;
 2 0 2 5 4&lt;br /&gt;
Ieșire&lt;br /&gt;
 NU&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Nodul &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; are ca tată pe &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, iar nodul &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; are ca tată pe &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 100001&lt;br /&gt;
Consola&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def sunt_restrictii_incorecte(n, t):&lt;br /&gt;
    # Verifică restricțiile pentru n&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    # Verifică restricțiile pentru t[i]&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if not (0 &amp;lt;= t[i] &amp;lt;= n):&lt;br /&gt;
            return True&lt;br /&gt;
&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def este_vector_de_tati(t):&lt;br /&gt;
    n = len(t)&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă restricțiile sunt respectate&lt;br /&gt;
    if sunt_restrictii_incorecte(n, t):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă rădăcina arborelui este corectă&lt;br /&gt;
    if t[0] != 0:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă fiecare element al vectorului este un index valid&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if not (0 &amp;lt;= t[i] &amp;lt; n):&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
# Citeste numarul n&lt;br /&gt;
n = int(input(&amp;quot;Introduceti numarul n: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
# Ieși din program dacă restricțiile pentru n nu sunt respectate&lt;br /&gt;
if n &amp;lt; 1 or n &amp;gt; 100000:&lt;br /&gt;
    print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
else:&lt;br /&gt;
    # Citeste vectorul t&lt;br /&gt;
    t = list(map(int, input(&amp;quot;Introduceti vectorul t: &amp;quot;).split()))&lt;br /&gt;
&lt;br /&gt;
    # Verifica daca restrictiile sunt respectate si afiseaza mesajul corespunzator&lt;br /&gt;
    if sunt_restrictii_incorecte(n, t):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        # Verifica daca t este vector de tati si afiseaza rezultatul&lt;br /&gt;
        if este_vector_de_tati(t):&lt;br /&gt;
            print(&amp;quot;DA&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;NU&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0652_%E2%80%93_Afi%C8%99are_Fii&amp;diff=8559</id>
		<title>0652 – Afișare Fii</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0652_%E2%80%93_Afi%C8%99are_Fii&amp;diff=8559"/>
		<updated>2023-12-27T14:54:30Z</updated>

		<summary type="html">&lt;p&gt;Simina: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri distincte din arbore. Afișați fiii fiecăruia dintre cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;afisarefiiIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații. Linia a trei conține numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar linia a patra &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri, &amp;lt;code&amp;gt;x[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x[2]&amp;lt;/code&amp;gt;, … , &amp;lt;code&amp;gt;x[k]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;afisarefiiOUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii. Linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; va conține numărul de fii ai lui &amp;lt;code&amp;gt;x[i]&amp;lt;/code&amp;gt; urmat de un spațiu și de lista fiilor lui &amp;lt;code&amp;gt;x[i]&amp;lt;/code&amp;gt;, separați și ei printr-un spațiu.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* dacă un nod &amp;lt;code&amp;gt;x[i]&amp;lt;/code&amp;gt; nu are fii, linia corespunzătoare din fișierul de ieșire va contine doar valoarea &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;afisarefiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
 4&lt;br /&gt;
 3 4 7 1&lt;br /&gt;
&amp;lt;code&amp;gt;afisarefiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 2 4 &lt;br /&gt;
 1 1 &lt;br /&gt;
 0 &lt;br /&gt;
 2 6 8 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;afisarefiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
 4&lt;br /&gt;
 3 4 7 1&lt;br /&gt;
&amp;lt;code&amp;gt;afisarefiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= k &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
def afisare_fii(n, tati, k, noduri_selectate):&lt;br /&gt;
    restrictii_mesaj = verifica_restrictii(n, k)&lt;br /&gt;
    if restrictii_mesaj:&lt;br /&gt;
        return restrictii_mesaj&lt;br /&gt;
&lt;br /&gt;
    rezultat = []&lt;br /&gt;
&lt;br /&gt;
    for nod in noduri_selectate:&lt;br /&gt;
        if not (1 &amp;lt;= nod &amp;lt;= n):&lt;br /&gt;
            return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        fii = [i for i, parinte in enumerate(tati, 1) if parinte == nod]&lt;br /&gt;
        rezultat.append((len(fii), fii))&lt;br /&gt;
&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
with open(&amp;quot;afisarefiiIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
    n = int(f.readline().strip())&lt;br /&gt;
    tati = list(map(int, f.readline().strip().split()))&lt;br /&gt;
    k = int(f.readline().strip())&lt;br /&gt;
    noduri_selectate = list(map(int, f.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
# Verificarea restricțiilor și obținerea rezultatului&lt;br /&gt;
restrictii_mesaj = verifica_restrictii(n, k)&lt;br /&gt;
if restrictii_mesaj:&lt;br /&gt;
    with open(&amp;quot;afisarefiiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(restrictii_mesaj)&lt;br /&gt;
else:&lt;br /&gt;
    rezultat = afisare_fii(n, tati, k, noduri_selectate)&lt;br /&gt;
    with open(&amp;quot;afisarefiiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        if isinstance(rezultat, str):&lt;br /&gt;
            f.write(rezultat)&lt;br /&gt;
        else:&lt;br /&gt;
            for nr_fii, fii in rezultat:&lt;br /&gt;
                f.write(f&amp;quot;{nr_fii} {&#039; &#039;.join(map(str, fii))}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0636_%E2%80%93_Arbore&amp;diff=8558</id>
		<title>0636 – Arbore</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0636_%E2%80%93_Arbore&amp;diff=8558"/>
		<updated>2023-12-27T14:53:27Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dau cele &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; muchii ale unui arbore cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; . Afișați vectorul de tați al arborelui cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;arboreIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n k&amp;lt;/code&amp;gt;, Următoarele &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; linii vor conține câte o pereche &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, reprezentând muchiile arborelui.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;arboreOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie elementele vectorului de tați al arborelui cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, separate printr-un spațiu.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 : =&lt;br /&gt;
&amp;lt;code&amp;gt;arboreIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 4&lt;br /&gt;
 1 2&lt;br /&gt;
 1 4&lt;br /&gt;
 1 7&lt;br /&gt;
 3 7&lt;br /&gt;
 5 7&lt;br /&gt;
 6 7&lt;br /&gt;
&amp;lt;code&amp;gt;arboreOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 : =&lt;br /&gt;
&amp;lt;code&amp;gt;arboreIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1000 1001&lt;br /&gt;
 1 2&lt;br /&gt;
 1 4&lt;br /&gt;
 1 7&lt;br /&gt;
 3 7&lt;br /&gt;
 5 7&lt;br /&gt;
 6 7&lt;br /&gt;
&amp;lt;code&amp;gt;arboreOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, k, muchii):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not (1 &amp;lt;= k &amp;lt;= n) or len(muchii) != n - 1:&lt;br /&gt;
        with open(&amp;quot;arboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
            file_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    # Verifică dacă nodurile din muchii sunt în intervalul corect&lt;br /&gt;
    for muchie in muchii:&lt;br /&gt;
        if not (1 &amp;lt;= muchie[0] &amp;lt;= n) or not (1 &amp;lt;= muchie[1] &amp;lt;= n):&lt;br /&gt;
            with open(&amp;quot;arboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
                file_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dfs(nod, parinte, graf, rezultat):&lt;br /&gt;
    rezultat[nod] = parinte&lt;br /&gt;
    for vecin in graf[nod]:&lt;br /&gt;
        if vecin != parinte:&lt;br /&gt;
            dfs(vecin, nod, graf, rezultat)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    with open(&amp;quot;arboreIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as file_in:&lt;br /&gt;
        n, k = map(int, file_in.readline().split())&lt;br /&gt;
        muchii = [tuple(map(int, file_in.readline().split())) for _ in range(n - 1)]&lt;br /&gt;
&lt;br /&gt;
    # Verificarea restricțiilor&lt;br /&gt;
    if not verifica_restrictii(n, k, muchii):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Construirea grafului&lt;br /&gt;
    graf = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
    for muchie in muchii:&lt;br /&gt;
        graf[muchie[0]].append(muchie[1])&lt;br /&gt;
        graf[muchie[1]].append(muchie[0])&lt;br /&gt;
&lt;br /&gt;
    # Inițializarea vectorului de tați cu 0&lt;br /&gt;
    parinti = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    # Apelarea algoritmului DFS&lt;br /&gt;
    dfs(k, 0, graf, parinti)&lt;br /&gt;
&lt;br /&gt;
    # Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;arboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
        file_out.write(&amp;quot; &amp;quot;.join(map(str, parinti[1:])))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0638_-_Nivele&amp;diff=8557</id>
		<title>0638 - Nivele</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0638_-_Nivele&amp;diff=8557"/>
		<updated>2023-12-27T14:52:48Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: == Enunț == Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, etc.  = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri din arbore. Determinați pentru fiecare dintre cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri nivelul pe care se află.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;niveleIN.txt&amp;lt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri din arbore. Determinați pentru fiecare dintre cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri nivelul pe care se află.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;niveleIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații. Linia a treia conține numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar linia a patra &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri, &amp;lt;code&amp;gt;x[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x[2]&amp;lt;/code&amp;gt;, … , &amp;lt;code&amp;gt;x[k]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;niveleOUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii. Linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; va conține nivelul pe care se află nodul &amp;lt;code&amp;gt;x[i]&amp;lt;/code&amp;gt; în arborele dat.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu corespunde restricțiilor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;niveleIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
 4&lt;br /&gt;
 1 3 4 7&lt;br /&gt;
&amp;lt;code&amp;gt;niveleOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 1&lt;br /&gt;
 3 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;niveleIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
 4&lt;br /&gt;
 1 3 4 7&lt;br /&gt;
&amp;lt;code&amp;gt;niveleOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, k, tati):&lt;br /&gt;
    if not(1 &amp;lt;= k &amp;lt;= n &amp;lt;= 100) or tati.count(0) != 1:&lt;br /&gt;
        with open(&amp;quot;niveleOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f_out:&lt;br /&gt;
            f_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def determina_nivelul(n, tati, k, noduri):&lt;br /&gt;
    # Verificare pentru restricții&lt;br /&gt;
    if not verifica_restrictii(n, k, tati):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    nivele = [0] * n  # nivelele pentru fiecare nod&lt;br /&gt;
    radacina = tati.index(0) + 1  # găsim poziția rădăcinii în vectorul de tați&lt;br /&gt;
&lt;br /&gt;
    def dfs(nod, nivel):&lt;br /&gt;
        nivele[nod - 1] = nivel  # nodurile sunt numerotate de la 1, așa că indexăm cu nod-1&lt;br /&gt;
        for fiu in range(1, n + 1):&lt;br /&gt;
            if tati[fiu - 1] == nod:&lt;br /&gt;
                dfs(fiu, nivel + 1)&lt;br /&gt;
&lt;br /&gt;
    dfs(radacina, 1)&lt;br /&gt;
&lt;br /&gt;
    rezultate = [nivele[nod - 1] for nod in noduri]&lt;br /&gt;
&lt;br /&gt;
    # Scrierea rezultatelor în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;niveleOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f_out:&lt;br /&gt;
        for rezultat in rezultate:&lt;br /&gt;
            f_out.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
with open(&amp;quot;niveleIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
    n = int(f.readline().strip())&lt;br /&gt;
    tati = list(map(int, f.readline().split()))&lt;br /&gt;
    k = int(f.readline().strip())&lt;br /&gt;
    noduri = list(map(int, f.readline().split()))&lt;br /&gt;
&lt;br /&gt;
# Determinarea nivelului pentru fiecare nod dat&lt;br /&gt;
determina_nivelul(n, tati, k, noduri)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0473_-_Bipartit_Complet&amp;diff=8556</id>
		<title>0473 - Bipartit Complet</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0473_-_Bipartit_Complet&amp;diff=8556"/>
		<updated>2023-12-27T14:47:41Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerinţa = Se consideră două mulţimi nevide &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;, cu proprietatea că formează o partiție a mulțimii &amp;lt;code&amp;gt;{1,2,...,n}.&amp;lt;/code&amp;gt; Să se construiască un graf bipartit complet cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri, bipartit peste partiţia formată din mulțimile &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;.  = Date de intrare = Fişierul de intrare &amp;lt;code&amp;gt;bipartitcompletIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Urmează un număr &amp;lt;code&amp;gt;k&amp;lt;/code...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se consideră două mulţimi nevide &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;, cu proprietatea că formează o partiție a mulțimii &amp;lt;code&amp;gt;{1,2,...,n}.&amp;lt;/code&amp;gt; Să se construiască un graf bipartit complet cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri, bipartit peste partiţia formată din mulțimile &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;bipartitcompletIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Urmează un număr &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, apoi &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; numere naturale distincte cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, reprezentând vârfurile din &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;. Mulțimea &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; conține toate numerele naturale cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; care nu sunt în &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieşire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;bipartitcompletOUT.txt&amp;lt;/code&amp;gt; va conţine matricea de adiacență a grafului construit, câte o linie a matricei pe o linie a fișierului, elementele de pe o linie fiind separate prin exact un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricţii şi precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 &amp;lt; k  &amp;lt; n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;bipartitcompletIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 3 &lt;br /&gt;
 4 6 3&lt;br /&gt;
&amp;lt;code&amp;gt;bipartitcompletOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 0 1 1 0 1 0 &lt;br /&gt;
 0 0 1 1 0 1 0 &lt;br /&gt;
 1 1 0 0 1 0 1 &lt;br /&gt;
 1 1 0 0 1 0 1 &lt;br /&gt;
 0 0 1 1 0 1 0 &lt;br /&gt;
 1 1 0 0 1 0 1 &lt;br /&gt;
 0 0 1 1 0 1 0 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 : =&lt;br /&gt;
&amp;lt;code&amp;gt;bipartitcompletIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001&lt;br /&gt;
 3 &lt;br /&gt;
 4 6 3&lt;br /&gt;
&amp;lt;code&amp;gt;bipartitcompletOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(k, n):&lt;br /&gt;
    if not (1 &amp;lt; k &amp;lt; n &amp;lt;= 100):&lt;br /&gt;
        with open(&amp;quot;bipartitcompletOUT.txt&amp;quot;, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def construieste_graf(n, A):&lt;br /&gt;
    # Inițializăm matricea de adiacență cu zerouri&lt;br /&gt;
    graf = [[0] * n for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    # Marcam conexiunile dintre vârfurile din A și B&lt;br /&gt;
    for i in A:&lt;br /&gt;
        for j in range(1, n + 1):&lt;br /&gt;
            if j not in A:&lt;br /&gt;
                graf[i - 1][j - 1] = 1&lt;br /&gt;
                graf[j - 1][i - 1] = 1  # Adăugăm și conexiunea inversă&lt;br /&gt;
&lt;br /&gt;
    return graf&lt;br /&gt;
&lt;br /&gt;
def scrie_matrice_in_fisier(matrice, nume_fisier):&lt;br /&gt;
    with open(nume_fisier, &#039;w&#039;) as f:&lt;br /&gt;
        for linie in matrice:&lt;br /&gt;
            f.write(&#039; &#039;.join(map(str, linie)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # Citim datele de intrare din fișier&lt;br /&gt;
    with open(&amp;quot;bipartitcompletIN.txt&amp;quot;, &#039;r&#039;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
        k = int(f.readline().strip())&lt;br /&gt;
        A = list(map(int, f.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verificăm restricțiile&lt;br /&gt;
    if not verifica_restrictii(k, n):&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
    # Construim graful bipartit&lt;br /&gt;
    graf = construieste_graf(n, A)&lt;br /&gt;
&lt;br /&gt;
    # Scriem matricea de adiacență în fișierul de ieșire&lt;br /&gt;
    scrie_matrice_in_fisier(graf, &amp;quot;bipartitcompletOUT.txt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4112_-_Falkland&amp;diff=8555</id>
		<title>4112 - Falkland</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4112_-_Falkland&amp;diff=8555"/>
		<updated>2023-12-27T14:36:03Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Pe teritoriul insulelelor FalkLand exista &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; britanici notati de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; argentinieni notati de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;.  Aceștia sunt în pragul războiului din pricina neînțelegerilor teritoriale. Pentru a restabili pacea prim-ministrul Marii Britanii Margaret Thatcher a venit cu o idee ingenioasă, care presupune renunțarea la acest teritoriu atât din partea Argentinei cât și a Marii...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Pe teritoriul insulelelor FalkLand exista &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; britanici notati de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; argentinieni notati de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aceștia sunt în pragul războiului din pricina neînțelegerilor teritoriale. Pentru a restabili pacea prim-ministrul Marii Britanii Margaret Thatcher a venit cu o idee ingenioasă, care presupune renunțarea la acest teritoriu atât din partea Argentinei cât și a Marii Britanii, insulele Falkland urmând să devină un teritoriu autonom.&lt;br /&gt;
&lt;br /&gt;
Deoarece în cazul unui război ambele părți au de pierdut, Leopoldo Galtieri(președintele Argentinei) a acceptat propunerea. Pentru a-și îndeplini planul, aceștia trebuie să detensioneze relațiile dintre argentinieni și britanici în scopul de a crea un teritoriu autonom prosper.&lt;br /&gt;
&lt;br /&gt;
Fiecare britanic are diferite cunoștințe de naționalitate argentiniană pe insula. Deoarece aceștia se cunosc între ei, nu sunt dușmani de moarte, dar nici prieteni.&lt;br /&gt;
&lt;br /&gt;
Se știe că fiecare britanic poate lega &amp;lt;code&amp;gt;o singură&amp;lt;/code&amp;gt; relație de prietenie cu una dintre cunoștințele sale argentiniene și vice-versa. Pentru a detensiona relațiile, cele două naționalități sunt obligate să se cunoască și să lege cât mai multe relații de prietenie.&lt;br /&gt;
&lt;br /&gt;
Având în vedere faptul că fiecare britanic poate lega o singură relație de prietenie cu un argentinian, iar relațiile de prietenie se știu deoarece acestea sunt evidente, Margaret Thatcher va solicită ajutorul în aflarea numărului maxim de relații noi de prietenie care se vor lega pe insula .&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;falklandIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, reprezentând numărul de britanici, argentinieni și de relații de prietenie ce pot fi legate.&lt;br /&gt;
&lt;br /&gt;
Pe următoarele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii se află &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; perechii de numere &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; cu semnificația : britanicul &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; poate lega o relație de prietenie cu argentinianul &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;falklandOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;, reprezentând numărul maxim de relații de prietenie ce pot fi legate pe insula .&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n, m ≤ 50.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ 150.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ x ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ y ≤ m&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;falklandIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 3 5&lt;br /&gt;
 1 1&lt;br /&gt;
 1 2&lt;br /&gt;
 2 2&lt;br /&gt;
 2 3&lt;br /&gt;
 3 3&lt;br /&gt;
&amp;lt;code&amp;gt;falklandOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;falklandIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100000 100000 100000&lt;br /&gt;
 1 1&lt;br /&gt;
 1 2&lt;br /&gt;
 2 2&lt;br /&gt;
 2 3&lt;br /&gt;
 3 3&lt;br /&gt;
&amp;lt;code&amp;gt;falklandOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictiile(n, m, k):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 50000 and 1 &amp;lt;= m &amp;lt;= 50000 and 1 &amp;lt;= k &amp;lt;= 150000):&lt;br /&gt;
        with open(&amp;quot;falklandOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
def numar_maxim_prieteni(n, m, k, prietenii):&lt;br /&gt;
    graf = defaultdict(list)&lt;br /&gt;
&lt;br /&gt;
    for prietenie in prietenii:&lt;br /&gt;
        x, y = prietenie&lt;br /&gt;
        graf[x].append(y)&lt;br /&gt;
&lt;br /&gt;
    def dfs(britanic, vizitat, potrivire):&lt;br /&gt;
        for argentinian in graf[britanic]:&lt;br /&gt;
            if not vizitat[argentinian]:&lt;br /&gt;
                vizitat[argentinian] = True&lt;br /&gt;
&lt;br /&gt;
                if potrivire[argentinian] == -1 or dfs(potrivire[argentinian], vizitat, potrivire):&lt;br /&gt;
                    potrivire[argentinian] = britanic&lt;br /&gt;
                    return True&lt;br /&gt;
&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    def prietenii_maximi():&lt;br /&gt;
        potrivire = [-1] * (m + 1)&lt;br /&gt;
        rezultat = 0&lt;br /&gt;
&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            vizitat = [False] * (m + 1)&lt;br /&gt;
            if dfs(i, vizitat, potrivire):&lt;br /&gt;
                rezultat += 1&lt;br /&gt;
&lt;br /&gt;
        return rezultat&lt;br /&gt;
&lt;br /&gt;
    prieteni_maximi = prietenii_maximi()&lt;br /&gt;
    return prieteni_maximi&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
with open(&amp;quot;falklandIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
    n, m, k = map(int, f.readline().split())&lt;br /&gt;
    verifica_restrictiile(n, m, k)&lt;br /&gt;
    prietenii = [tuple(map(int, f.readline().split())) for _ in range(k)]&lt;br /&gt;
&lt;br /&gt;
# Calcularea rezultatului&lt;br /&gt;
rezultat = numar_maxim_prieteni(n, m, k, prietenii)&lt;br /&gt;
&lt;br /&gt;
# Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
with open(&amp;quot;falklandOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
    f.write(str(rezultat))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1651_-_Graf&amp;diff=8426</id>
		<title>1651 - Graf</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1651_-_Graf&amp;diff=8426"/>
		<updated>2023-12-27T07:28:38Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Se dă lista muchiilor unui graf neorientat ponderat. Să se determine vârful pentru care media aritmetică a ponderilor muchiilor incidente este minimă. Dacă există mai multe vârfuri cu aceeași medie minimă, se va afișa vârful numerotat cu o valoare mai mică.  = Date de intrare = Programul citește de la tastatură numerele &amp;lt;code&amp;gt;n m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri și numărul de muchii din graf, apoi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; triplete &amp;lt;code&amp;gt;i j p&amp;lt;/co...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat ponderat. Să se determine vârful pentru care media aritmetică a ponderilor muchiilor incidente este minimă. Dacă există mai multe vârfuri cu aceeași medie minimă, se va afișa vârful numerotat cu o valoare mai mică.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numerele &amp;lt;code&amp;gt;n m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri și numărul de muchii din graf, apoi &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; triplete &amp;lt;code&amp;gt;i j p&amp;lt;/code&amp;gt;, reprezentând muchiile, date prin extremități și pondere.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul &amp;lt;code&amp;gt;vf&amp;lt;/code&amp;gt;, reprezentând vârful determinat.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* ponderile muchiilor sunt numere naturale nenule mai mici decât &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* graful dat nu conține noduri izolate&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5 6&lt;br /&gt;
 1 2 10&lt;br /&gt;
 2 3 2&lt;br /&gt;
 2 5 2&lt;br /&gt;
 3 5 12&lt;br /&gt;
 3 4 1&lt;br /&gt;
 4 5 5&lt;br /&gt;
Ieșire&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Mediile ponderilor muchiilor incidente cu vârfurile grafului sunt:&lt;br /&gt;
&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;4.66667&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru vârful &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; media este &amp;lt;code&amp;gt;6.33333&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Astfel media minimă este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, pentru vârful &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;Intrare&amp;lt;/code&amp;gt;&lt;br /&gt;
 &amp;lt;code&amp;gt;101&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;consola&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restricții(n, m, muchii):&lt;br /&gt;
    # Verificăm restricțiile&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or any(not (1 &amp;lt;= vf1 &amp;lt;= n and 1 &amp;lt;= vf2 &amp;lt;= n) for vf1, vf2, _ in muchii) or any(not (1 &amp;lt;= p &amp;lt; 1000) for _, _, p in muchii):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def gaseste_varf_minim_media_ponderilor(n, m, muchii):&lt;br /&gt;
    # Initializăm un dicționar pentru a stoca ponderile muchiilor incidente pentru fiecare vârf&lt;br /&gt;
    ponderi_vf = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
&lt;br /&gt;
    # Citim și memorăm ponderile muchiilor în dicționar&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        vf1, vf2, pondera = muchii[i]&lt;br /&gt;
        ponderi_vf[vf1].append(pondera)&lt;br /&gt;
        ponderi_vf[vf2].append(pondera)&lt;br /&gt;
&lt;br /&gt;
    # Calculăm media aritmetică a ponderilor pentru fiecare vârf&lt;br /&gt;
    medii_ponderi = {vf: sum(ponderi) / len(ponderi) for vf, ponderi in ponderi_vf.items()}&lt;br /&gt;
&lt;br /&gt;
    # Găsim vârful cu media minimă&lt;br /&gt;
    vf_min_media = min(medii_ponderi, key=medii_ponderi.get)&lt;br /&gt;
&lt;br /&gt;
    return vf_min_media&lt;br /&gt;
&lt;br /&gt;
# Citirea numărului de vârfuri&lt;br /&gt;
n = int(input(&amp;quot;Introduceți numărul de vârfuri &amp;quot;))&lt;br /&gt;
if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
    print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
else:&lt;br /&gt;
    # Citirea numărului de muchii&lt;br /&gt;
    m = int(input(&amp;quot;Introduceți numărul de muchii: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    # Citirea muchiilor și ponderilor&lt;br /&gt;
    print(&amp;quot;Introduceți extremitățile și ponderea fiecărei muchii:&amp;quot;)&lt;br /&gt;
    muchii = [tuple(map(int, input().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    # Apelarea funcției și afișarea rezultatului&lt;br /&gt;
    rezultat = gaseste_varf_minim_media_ponderilor(n, m, muchii)&lt;br /&gt;
    if rezultat is not None:&lt;br /&gt;
        print(rezultat)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3693_%E2%80%93_Binary_Tree&amp;diff=8419</id>
		<title>3693 – Binary Tree</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3693_%E2%80%93_Binary_Tree&amp;diff=8419"/>
		<updated>2023-12-27T06:58:36Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: == Enunț == Un arbore binar complet este un arbore binar în care toate nivelurile, cu excepția ultimului sunt ocupate în întregime. În general, deși nu este obligatoriu, toate nodurile de pe ultimul nivel sunt grupate în partea stânga a acestuia.  = Cerința = Se dau un arbore binar complet infinit cu rădăcina în nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; în care pentru orice nod &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; copiii săi sunt nodurile &amp;lt;code&amp;gt;2*i&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;2*i+1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Un arbore binar complet este un arbore binar în care toate nivelurile, cu excepția ultimului sunt ocupate în întregime. În general, deși nu este obligatoriu, toate nodurile de pe ultimul nivel sunt grupate în partea stânga a acestuia.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dau un arbore binar complet infinit cu rădăcina în nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; în care pentru orice nod &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; copiii săi sunt nodurile &amp;lt;code&amp;gt;2*i&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;2*i+1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; perechi de numere &amp;lt;code&amp;gt;u v&amp;lt;/code&amp;gt;. Se cere să se afle pentru fiecare pereche lungimea cel mai scurt drum(ca număr de muchii) dintre nodurile &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; din arbore.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numărul &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;, iar apoi &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; perechi de numere naturale, fiecare pereche pe câte o linie.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran pentru fiecare pereche &amp;lt;code&amp;gt;u v&amp;lt;/code&amp;gt; distanța dintre nodurile &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; din arbore.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Q ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ u, v ≤ 2.000.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5&lt;br /&gt;
 1 2&lt;br /&gt;
 4 5&lt;br /&gt;
 8 15&lt;br /&gt;
 11 3&lt;br /&gt;
 12 14&lt;br /&gt;
Ieșire&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 6&lt;br /&gt;
 4&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Așa arată primele &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; nivele ale arborelui descris în enunț:&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 100000000&lt;br /&gt;
Consola&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare_restrictii(Q, u, v):&lt;br /&gt;
    if not (1 &amp;lt;= Q &amp;lt;= 100000) or not (1 &amp;lt;= u &amp;lt;= 2000000000) or not (1 &amp;lt;= v &amp;lt;= 2000000000) or u &amp;lt; 0 or v &amp;lt; 0:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
def gaseste_distanta(u, v):&lt;br /&gt;
    # Funcție pentru a găsi distanța dintre două noduri în arborele binar complet&lt;br /&gt;
    distanta = 0&lt;br /&gt;
    while u != v:&lt;br /&gt;
        # Asigurăm că u este întotdeauna mai mic sau egal decât v&lt;br /&gt;
        if u &amp;gt; v:&lt;br /&gt;
            u, v = v, u&lt;br /&gt;
        v //= 2  # Urmează căutarea pe nivelul anterior pentru v&lt;br /&gt;
        distanta += 1&lt;br /&gt;
&lt;br /&gt;
    return distanta&lt;br /&gt;
&lt;br /&gt;
# Citim numărul de perechi&lt;br /&gt;
Q = int(input(&amp;quot;Introdu numărul de perechi (Q): &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
# Verificăm restricțiile pentru Q&lt;br /&gt;
verificare_restrictii(Q, Q, Q)&lt;br /&gt;
&lt;br /&gt;
valori_u = []&lt;br /&gt;
valori_v = []&lt;br /&gt;
&lt;br /&gt;
# Citim și procesăm fiecare pereche&lt;br /&gt;
for _ in range(Q):&lt;br /&gt;
    u, v = map(int, input(&amp;quot;Introdu perechea u v: &amp;quot;).split())&lt;br /&gt;
    valori_u.append(u)&lt;br /&gt;
    valori_v.append(v)&lt;br /&gt;
&lt;br /&gt;
# Verificăm restricțiile pentru u și v&lt;br /&gt;
verificare_restrictii(Q, max(valori_u), max(valori_v))&lt;br /&gt;
&lt;br /&gt;
# Afișăm rezultatele la final&lt;br /&gt;
print(&amp;quot;\nRezultate:&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for u, v in zip(valori_u, valori_v):&lt;br /&gt;
    distanta = gaseste_distanta(u, v)&lt;br /&gt;
    print(f&amp;quot;{distanta}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0647_%E2%80%93_Subarbore2&amp;diff=8418</id>
		<title>0647 – Subarbore2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0647_%E2%80%93_Subarbore2&amp;diff=8418"/>
		<updated>2023-12-26T23:32:51Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Fiecare nod al arborelui are asociată o valoare numerică întreagă. Determinați suma valorilor asociate nodurilor din subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;subarbore2IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe a doua linie se află vectorul de...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Fiecare nod al arborelui are asociată o valoare numerică întreagă. Determinați suma valorilor asociate nodurilor din subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;subarbore2IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe a doua linie se află vectorul de tați al arborelui, valorile fiind separate prin spații. Pe linia a treia se află, în ordine, valorile asociate nodurilor din arbore.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;subarbore2OUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie valoarea cerută.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* valorile asociate nodurilor din arbore sunt numere întregi din intervalul &amp;lt;code&amp;gt;[-1000,1000]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarbore2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8 4&lt;br /&gt;
 4 3 0 3 2 1 4 1&lt;br /&gt;
 -3 -2 4 4 0 -3 3 2 &lt;br /&gt;
&amp;lt;code&amp;gt;subarbore2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarbore2IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 2&lt;br /&gt;
 4 3 0 3 2 1 4 1&lt;br /&gt;
 -3 -2 4 4 0 -3 3 2 &lt;br /&gt;
&amp;lt;code&amp;gt;subarbore2OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare_restrictii(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not (1 &amp;lt;= k &amp;lt;= n):&lt;br /&gt;
        with open(&#039;subarbore2OUT.txt&#039;, &#039;w&#039;) as fisier_iesire:&lt;br /&gt;
            fisier_iesire.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dfs(nod, lista_adiacenta, valori):&lt;br /&gt;
    suma_subarbore = valori[nod - 1]  # Corectarea indexării pentru a evita IndexError&lt;br /&gt;
    for copil in lista_adiacenta[nod]:&lt;br /&gt;
        suma_subarbore += dfs(copil, lista_adiacenta, valori)&lt;br /&gt;
    return suma_subarbore&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    with open(&#039;subarbore2IN.txt&#039;, &#039;r&#039;) as fisier:&lt;br /&gt;
        n, k = map(int, fisier.readline().split())&lt;br /&gt;
&lt;br /&gt;
    # Verificarea restricțiilor&lt;br /&gt;
    if not verificare_restrictii(n, k):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Citirea celorlalte date de intrare&lt;br /&gt;
    with open(&#039;subarbore2IN.txt&#039;, &#039;r&#039;) as fisier:&lt;br /&gt;
        fisier.readline()  # Trecem peste linia cu n și k&lt;br /&gt;
        parinti = list(map(int, fisier.readline().split()))&lt;br /&gt;
        valori = list(map(int, fisier.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Construirea listei de adiacență&lt;br /&gt;
    lista_adiacenta = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if parinti[i] != 0:&lt;br /&gt;
            lista_adiacenta[parinti[i]].append(i + 1)&lt;br /&gt;
&lt;br /&gt;
    # Calcularea sumei valorilor asociate nodurilor din subarborele cu rădăcina în k&lt;br /&gt;
    rezultat = dfs(k, lista_adiacenta, valori)&lt;br /&gt;
&lt;br /&gt;
    # Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
    with open(&#039;subarbore2OUT.txt&#039;, &#039;w&#039;) as fisier_iesire:&lt;br /&gt;
        fisier_iesire.write(str(rezultat))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0646_%E2%80%93_Subarbore1&amp;diff=8417</id>
		<title>0646 – Subarbore1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0646_%E2%80%93_Subarbore1&amp;diff=8417"/>
		<updated>2023-12-26T23:28:15Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Afișați, în ordine crescătoare, nodurile terminale din subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;subarbore1IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Afișați, în ordine crescătoare, nodurile terminale din subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;subarbore1IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;subarbore1OUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie nodurile terminale din subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, în ordine crescătoare, separate printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarbore1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8 4&lt;br /&gt;
 4 3 0 3 2 1 4 1&lt;br /&gt;
&amp;lt;code&amp;gt;subarbore1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 7 8&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarbore1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 2&lt;br /&gt;
 4 3 0 3 2 1 4 1&lt;br /&gt;
&amp;lt;code&amp;gt;subarbore1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def dfs(nod, lista_adiacenta, rezultat):&lt;br /&gt;
    # Verificăm dacă nodul este terminal&lt;br /&gt;
    if nod not in lista_adiacenta:&lt;br /&gt;
        rezultat.append(nod)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Parcurgem vecinii nodului și aplicăm DFS pe fiecare dintre ei&lt;br /&gt;
    for vecin in lista_adiacenta[nod]:&lt;br /&gt;
        dfs(vecin, lista_adiacenta, rezultat)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100 and 1 &amp;lt;= k &amp;lt;= n):&lt;br /&gt;
        with open(&amp;quot;subarbore1OUT.txt&amp;quot;, &#039;w&#039;) as fisier:&lt;br /&gt;
            fisier.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
def main(fisier_intrare, fisier_iesire):&lt;br /&gt;
    with open(fisier_intrare, &#039;r&#039;) as fisier:&lt;br /&gt;
        # Citim numărul de noduri și nodul k&lt;br /&gt;
        n, k = map(int, fisier.readline().split())&lt;br /&gt;
&lt;br /&gt;
        # Verificăm dacă restricțiile sunt respectate&lt;br /&gt;
        verifica_restrictii(n, k)&lt;br /&gt;
        &lt;br /&gt;
        # Citim vectorul de tați al arborelui&lt;br /&gt;
        tati = list(map(int, fisier.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Construim o listă de adiacență bazată pe vectorul de tați&lt;br /&gt;
    lista_adiacenta = {}&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        parinte = tati[i]&lt;br /&gt;
        if parinte not in lista_adiacenta:&lt;br /&gt;
            lista_adiacenta[parinte] = []&lt;br /&gt;
        lista_adiacenta[parinte].append(i + 1)  # Adăugăm nodul curent ca fiu al nodului părinte&lt;br /&gt;
&lt;br /&gt;
    # Aplicăm DFS pentru a identifica nodurile terminale din subarborele cu rădăcina în nodul k&lt;br /&gt;
    rezultat = []&lt;br /&gt;
    dfs(k, lista_adiacenta, rezultat)&lt;br /&gt;
&lt;br /&gt;
    # Scriem rezultatul în fișierul de ieșire&lt;br /&gt;
    with open(fisier_iesire, &#039;w&#039;) as fisier:&lt;br /&gt;
        if not rezultat:&lt;br /&gt;
            fisier.write(&amp;quot;Subarborele nu are noduri terminale&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            fisier.write(&#039; &#039;.join(map(str, sorted(rezultat))))&lt;br /&gt;
&lt;br /&gt;
# Exemplu de utilizare&lt;br /&gt;
main(&amp;quot;subarbore1IN.txt&amp;quot;, &amp;quot;subarbore1OUT.txt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0649_%E2%80%93_Subarbori&amp;diff=8416</id>
		<title>0649 – Subarbori</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0649_%E2%80%93_Subarbori&amp;diff=8416"/>
		<updated>2023-12-26T23:21:46Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați câte perechi de noduri neterminale distincte &amp;lt;code&amp;gt;p q&amp;lt;/code&amp;gt; din arbore au proprietatea că subarborele cu rădăcina în &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și cel cu rădăcina în &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; au același număr de noduri.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;subarboriIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vect...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați câte perechi de noduri neterminale distincte &amp;lt;code&amp;gt;p q&amp;lt;/code&amp;gt; din arbore au proprietatea că subarborele cu rădăcina în &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și cel cu rădăcina în &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; au același număr de noduri.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;subarboriIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;subarboriOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie valoarea cerută.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarboriIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;subarboriOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Singura pereche de noduri neterminale pentru care subarborii au același număr de noduri este &amp;lt;code&amp;gt;2 1&amp;lt;/code&amp;gt;. Subarborii cu rădăcina în &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; au câte &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; noduri fiecare.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;subarboriIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;subarboriOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
class NodArbore:&lt;br /&gt;
    def __init__(self, valoare):&lt;br /&gt;
        self.valoare = valoare&lt;br /&gt;
        self.copii = []&lt;br /&gt;
&lt;br /&gt;
def construieste_arbore(tati):&lt;br /&gt;
    noduri = [NodArbore(i) for i in range(len(tati))]&lt;br /&gt;
    &lt;br /&gt;
    for i, tata in enumerate(tati):&lt;br /&gt;
        if tata != 0:&lt;br /&gt;
            noduri[tata - 1].copii.append(noduri[i])&lt;br /&gt;
    &lt;br /&gt;
    return noduri[0]  # returnează rădăcina arborelui&lt;br /&gt;
&lt;br /&gt;
def numara_subarbori_cu_acelasi_numar_de_noduri(nod):&lt;br /&gt;
    if not nod.copii:&lt;br /&gt;
        return 1, {1: 1}  # tuplu: (număr de noduri, dicționar cu numărul de subarbori de acea dimensiune)&lt;br /&gt;
    &lt;br /&gt;
    total_noduri = 1&lt;br /&gt;
    dimensiuni_subarbori = {}&lt;br /&gt;
    &lt;br /&gt;
    for copil in nod.copii:&lt;br /&gt;
        dimensiune_copil, dimensiuni_subarbori_copil = numara_subarbori_cu_acelasi_numar_de_noduri(copil)&lt;br /&gt;
        total_noduri += dimensiune_copil&lt;br /&gt;
        &lt;br /&gt;
        for dimensiune, numar in dimensiuni_subarbori_copil.items():&lt;br /&gt;
            dimensiuni_subarbori[dimensiune] = dimensiuni_subarbori.get(dimensiune, 0) + numar&lt;br /&gt;
        &lt;br /&gt;
    dimensiuni_subarbori[total_noduri] = dimensiuni_subarbori.get(total_noduri, 0) + 1&lt;br /&gt;
    &lt;br /&gt;
    return total_noduri, dimensiuni_subarbori&lt;br /&gt;
&lt;br /&gt;
def verificare_restricții(n):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        with open(&amp;quot;subarboriOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
            fisier_iesire.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;subarboriIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fisier_intrare:&lt;br /&gt;
        n = int(fisier_intrare.readline().strip())&lt;br /&gt;
        verificare_restricții(n)&lt;br /&gt;
        tati = list(map(int, fisier_intrare.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
    radacina = construieste_arbore(tati)&lt;br /&gt;
    _, dimensiuni_subarbori = numara_subarbori_cu_acelasi_numar_de_noduri(radacina)&lt;br /&gt;
    &lt;br /&gt;
    rezultat = sum(numar * (numar - 1) // 2 for numar in dimensiuni_subarbori.values())&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;subarboriOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
        fisier_iesire.write(str(rezultat))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0648_%E2%80%93_Subarbore_Num%C4%83rare&amp;diff=8415</id>
		<title>0648 – Subarbore Numărare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0648_%E2%80%93_Subarbore_Num%C4%83rare&amp;diff=8415"/>
		<updated>2023-12-26T23:08:11Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Determinați câte noduri conține subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;subarborenumarareIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.  = Date de ieșir...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Determinați câte noduri conține subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;subarborenumarareIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;subarborenumarareOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie valoarea cerută.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarborenumarareIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8 4&lt;br /&gt;
 4 3 0 3 2 1 4 1&lt;br /&gt;
&amp;lt;code&amp;gt;subarborenumarareOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarborenumarareIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 2&lt;br /&gt;
 4 3 0 3 2 1 4 1&lt;br /&gt;
&amp;lt;code&amp;gt;subarborenumarareOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def numara_noduri_subarbore(n, k, vector_tati):&lt;br /&gt;
    relatii = {}&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        parinte = vector_tati[i - 1]&lt;br /&gt;
        if parinte not in relatii:&lt;br /&gt;
            relatii[parinte] = []&lt;br /&gt;
        relatii[parinte].append(i)&lt;br /&gt;
&lt;br /&gt;
    def numara_noduri_recursiv(nod):&lt;br /&gt;
        numar_noduri = 1&lt;br /&gt;
        if nod in relatii:&lt;br /&gt;
            for copil in relatii[nod]:&lt;br /&gt;
                numar_noduri += numara_noduri_recursiv(copil)&lt;br /&gt;
        return numar_noduri&lt;br /&gt;
&lt;br /&gt;
    rezultat = numara_noduri_recursiv(k)&lt;br /&gt;
&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
def verificare_restricții(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100 and 1 &amp;lt;= k &amp;lt;= n):&lt;br /&gt;
        with open(&amp;quot;subarborenumarareOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
# Citire date de intrare&lt;br /&gt;
with open(&amp;quot;subarborenumarareIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
    n, k = map(int, f.readline().split())&lt;br /&gt;
    vector_tati = list(map(int, f.readline().split()))&lt;br /&gt;
&lt;br /&gt;
# Verificare restricții&lt;br /&gt;
if verificare_restricții(n, k):&lt;br /&gt;
    # Calcul și scriere rezultat în fișierul de ieșire&lt;br /&gt;
    rezultat = numara_noduri_subarbore(n, k, vector_tati)&lt;br /&gt;
    with open(&amp;quot;subarborenumarareOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(rezultat))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0641_%E2%80%93_Subarbore&amp;diff=8414</id>
		<title>0641 – Subarbore</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0641_%E2%80%93_Subarbore&amp;diff=8414"/>
		<updated>2023-12-26T22:58:37Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Afișați, în ordine crescătoare, nodurile din subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;subarboreIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.  = Date de...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Afișați, în ordine crescătoare, nodurile din subarborele cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;subarboreIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și nodul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;subarboreOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie nodurile din subarbore, în ordine crescătoare, separate printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarboreIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 7&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;subarboreOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 5 6 7&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;subarboreIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 2&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;subarboreOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100 and 1 &amp;lt;= k &amp;lt;= n):&lt;br /&gt;
        with open(&amp;quot;subarboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
            outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dfs(nod, lista_adiacenta, noduri_subarbore):&lt;br /&gt;
    noduri_subarbore.append(nod)&lt;br /&gt;
    for copil in lista_adiacenta[nod]:&lt;br /&gt;
        dfs(copil, lista_adiacenta, noduri_subarbore)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    with open(&amp;quot;subarboreIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as infile:&lt;br /&gt;
        n, k = map(int, infile.readline().split())&lt;br /&gt;
        parinti = list(map(int, infile.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verificarea restricțiilor&lt;br /&gt;
    if not verifica_restrictii(n, k):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Construirea listei de adiacență bazată pe vectorul de tați&lt;br /&gt;
    lista_adiacenta = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if parinti[i - 1] != 0:&lt;br /&gt;
            lista_adiacenta[parinti[i - 1]].append(i)&lt;br /&gt;
&lt;br /&gt;
    # Identificarea și colectarea nodurilor din subarbore&lt;br /&gt;
    noduri_subarbore = []&lt;br /&gt;
    dfs(k, lista_adiacenta, noduri_subarbore)&lt;br /&gt;
&lt;br /&gt;
    # Sortarea și scrierea rezultatelor în fișierul de ieșire&lt;br /&gt;
    noduri_subarbore.sort()&lt;br /&gt;
    with open(&amp;quot;subarboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
        outfile.write(&amp;quot; &amp;quot;.join(map(str, noduri_subarbore)))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0640_%E2%80%93_NrFii&amp;diff=8413</id>
		<title>0640 – NrFii</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0640_%E2%80%93_NrFii&amp;diff=8413"/>
		<updated>2023-12-26T22:52:20Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați nodul din arbore cu număr maxim de fii. Dacă în arbore sunt mai multe noduri cu număr maxim de fii, afișați-le pe toate, în ordine crescătoare.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;nrfiiIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spaț...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați nodul din arbore cu număr maxim de fii. Dacă în arbore sunt mai multe noduri cu număr maxim de fii, afișați-le pe toate, în ordine crescătoare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;nrfiiIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;nrfiiOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie nodurile din arbore cu număr maxim de fii, în ordine crescătoare, separate printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def citeste_arbore(file_path):&lt;br /&gt;
    with open(file_path, &#039;r&#039;) as file:&lt;br /&gt;
        n = int(file.readline().strip())&lt;br /&gt;
        tati = list(map(int, file.readline().split()))&lt;br /&gt;
    return n, tati&lt;br /&gt;
&lt;br /&gt;
def verificare_restrictii(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 100:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        with open(&amp;quot;nrfiiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
            file_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def determina_noduri_max_fii(n, tati):&lt;br /&gt;
    fii = [0] * (n + 1)&lt;br /&gt;
    for tata in tati:&lt;br /&gt;
        if tata != -1:&lt;br /&gt;
            fii[tata] += 1&lt;br /&gt;
&lt;br /&gt;
    max_fii = max(fii)&lt;br /&gt;
    noduri_max_fii = [i for i in range(1, n + 1) if fii[i] == max_fii]&lt;br /&gt;
&lt;br /&gt;
    return noduri_max_fii&lt;br /&gt;
&lt;br /&gt;
def scrie_rezultat(file_path, noduri_max_fii):&lt;br /&gt;
    with open(file_path, &#039;w&#039;) as file:&lt;br /&gt;
        if noduri_max_fii:&lt;br /&gt;
            file.write(&#039; &#039;.join(map(str, noduri_max_fii)))&lt;br /&gt;
        else:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    file_input = &amp;quot;nrfiiIN.txt&amp;quot;&lt;br /&gt;
    file_output = &amp;quot;nrfiiOUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    n, tati = citeste_arbore(file_input)&lt;br /&gt;
&lt;br /&gt;
    if verificare_restrictii(n):&lt;br /&gt;
        noduri_max_fii = determina_noduri_max_fii(n, tati)&lt;br /&gt;
        scrie_rezultat(file_output, noduri_max_fii)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;nrfiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;nrfiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Nodul &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; are număr maxim de fii, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;nrfiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;nrfiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0650_%E2%80%93_kNivel&amp;diff=8412</id>
		<title>0650 – kNivel</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0650_%E2%80%93_kNivel&amp;diff=8412"/>
		<updated>2023-12-26T22:45:49Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: == Enunț == Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, etc.  = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și o valoare &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Determinați nodurile situate pe nivelul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; în arbore.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;knivelIN.txt&amp;lt;/code&amp;gt; conține pe prima lin...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și o valoare &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Determinați nodurile situate pe nivelul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; în arbore.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;knivelIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și valoarea &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;knivelOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie, în ordine crescătoare, nodurile situate pe nivelul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; în arbore.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* pe nivelul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; va exista cel puțin un nod&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;knivelIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8 3&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;knivelOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 5 7&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;knivelIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 2&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;knivelOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verificare_restrictii(n, k):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 100:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def gaseste_noduri_pe_nivel(tati, nivel):&lt;br /&gt;
    noduri_pe_nivel = []&lt;br /&gt;
    for i in range(len(tati)):&lt;br /&gt;
        nivel_nod_curent = 1  # Nivelul rădăcinii&lt;br /&gt;
        parinte_curent = tati[i]&lt;br /&gt;
&lt;br /&gt;
        while parinte_curent != 0:&lt;br /&gt;
            parinte_curent = tati[parinte_curent - 1]&lt;br /&gt;
            nivel_nod_curent += 1&lt;br /&gt;
&lt;br /&gt;
        if nivel_nod_curent == nivel:&lt;br /&gt;
            noduri_pe_nivel.append(i + 1)&lt;br /&gt;
&lt;br /&gt;
    return noduri_pe_nivel&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare din fișier&lt;br /&gt;
    with open(&amp;quot;knivelIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fisier_intrare:&lt;br /&gt;
        n, k = map(int, fisier_intrare.readline().split())&lt;br /&gt;
        tati = list(map(int, fisier_intrare.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verificarea restricțiilor&lt;br /&gt;
    if not verificare_restrictii(n, k):&lt;br /&gt;
        with open(&amp;quot;knivelOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
            fisier_iesire.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Găsirea nodurilor de pe nivelul k&lt;br /&gt;
    noduri_pe_nivel_k = gaseste_noduri_pe_nivel(tati, k)&lt;br /&gt;
&lt;br /&gt;
    # Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;knivelOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
        if noduri_pe_nivel_k:&lt;br /&gt;
            fisier_iesire.write(&amp;quot; &amp;quot;.join(map(str, noduri_pe_nivel_k)))&lt;br /&gt;
        else:&lt;br /&gt;
            fisier_iesire.write(&amp;quot;Nu există noduri pe nivelul specificat&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4159_%E2%80%93_Nivele11&amp;diff=8411</id>
		<title>4159 – Nivele11</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4159_%E2%80%93_Nivele11&amp;diff=8411"/>
		<updated>2023-12-26T22:36:20Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: == 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 &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, etc.  = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Afișați parcurgerea pe nivele a arborelui dat.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;nivele11IN.txt&amp;lt;/code&amp;gt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Î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 &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Afișați parcurgerea pe nivele a arborelui dat.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;nivele11IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;nivele11OUT.txt&amp;lt;/code&amp;gt; va conține mai multe linii. Fiecare linie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; conține, în ordine crescătoare, nodurile aflate pe nivelul &amp;lt;code&amp;gt;i-1&amp;lt;/code&amp;gt;, separate prin câte un epațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;nivele11IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;nivele11OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 &lt;br /&gt;
 2 4 &lt;br /&gt;
 1 5 7 &lt;br /&gt;
 6 8 &lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;nivele11IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;nivele11OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict, deque&lt;br /&gt;
&lt;br /&gt;
def verificare_restrictii(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 100:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        with open(&#039;nivele11OUT.txt&#039;, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def parcurgere_pe_nivele(n, tati):&lt;br /&gt;
    if not verificare_restrictii(n):&lt;br /&gt;
        return []&lt;br /&gt;
&lt;br /&gt;
    # Construim lista de adiacență pentru arbore&lt;br /&gt;
    graf = defaultdict(list)&lt;br /&gt;
    radacina = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        parinte = tati[i]&lt;br /&gt;
&lt;br /&gt;
        if parinte == 0:&lt;br /&gt;
            radacina = i + 1&lt;br /&gt;
        else:&lt;br /&gt;
            graf[parinte].append(i + 1)&lt;br /&gt;
&lt;br /&gt;
    # Folosim BFS pentru a parcurge nodurile pe nivele&lt;br /&gt;
    nivele = []&lt;br /&gt;
    vizitat = [False] * (n + 1)&lt;br /&gt;
    queue = deque([(radacina, 0)])  # Rădăcina se află pe nivelul 0&lt;br /&gt;
&lt;br /&gt;
    while queue:&lt;br /&gt;
        nod, nivel = queue.popleft()&lt;br /&gt;
        if not vizitat[nod]:&lt;br /&gt;
            vizitat[nod] = True&lt;br /&gt;
&lt;br /&gt;
            # Adăugăm nodul la lista corespunzătoare nivelului său&lt;br /&gt;
            if len(nivele) &amp;lt;= nivel:&lt;br /&gt;
                nivele.append([])&lt;br /&gt;
            nivele[nivel].append(nod)&lt;br /&gt;
&lt;br /&gt;
            # Adăugăm fiii nodului în coadă cu nivelul actual + 1&lt;br /&gt;
            for fiu in graf[nod]:&lt;br /&gt;
                if not vizitat[fiu]:&lt;br /&gt;
                    queue.append((fiu, nivel + 1))&lt;br /&gt;
&lt;br /&gt;
    return nivele&lt;br /&gt;
&lt;br /&gt;
# Citim datele din fișierul de intrare&lt;br /&gt;
with open(&#039;nivele11IN.txt&#039;, &#039;r&#039;) as file:&lt;br /&gt;
    n = int(file.readline().strip())&lt;br /&gt;
    tati = list(map(int, file.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
# Obținem rezultatul&lt;br /&gt;
rezultat = parcurgere_pe_nivele(n, tati)&lt;br /&gt;
&lt;br /&gt;
# Dacă rezultatul nu este gol, scriem rezultatul în fișierul de ieșire&lt;br /&gt;
if rezultat:&lt;br /&gt;
    with open(&#039;nivele11OUT.txt&#039;, &#039;w&#039;) as file:&lt;br /&gt;
        for nivel in rezultat:&lt;br /&gt;
            file.write(&#039; &#039;.join(map(str, nivel)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4156_%E2%80%93_Nivele_Pare&amp;diff=8410</id>
		<title>4156 – Nivele Pare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4156_%E2%80%93_Nivele_Pare&amp;diff=8410"/>
		<updated>2023-12-26T22:29:08Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: == Enunț == Într-un arbore cu rădăcină, nivelul unui nod este lungimea lanțului de la rădăcină la acel nod. Astfel, rădăcina este pe nivelul &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, etc.  = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați nodurile situate pe nivele pare.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;nivelepareIN.txt&amp;lt;/code&amp;gt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Într-un arbore cu rădăcină, nivelul unui nod este lungimea lanțului de la rădăcină la acel nod. Astfel, rădăcina este pe nivelul &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați nodurile situate pe nivele pare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;nivelepareIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;nivelepareOUT.txt&amp;lt;/code&amp;gt; va conține mai multe linii. Fiecare linie &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; conține, în ordine crescătoare, nodurile aflate pe nivelul &amp;lt;code&amp;gt;2*(i-1)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;nivelepareIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;nivelepareOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 1 5 7&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;nivelepareIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
&amp;lt;code&amp;gt;nivelepareOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 100:&lt;br /&gt;
        return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def citeste_arbore_din_fisier(file_path):&lt;br /&gt;
    with open(file_path, &#039;r&#039;) as file:&lt;br /&gt;
        n = int(file.readline())&lt;br /&gt;
        if not verifica_restrictii(n):&lt;br /&gt;
            return None, None, &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
        parinti = list(map(int, file.readline().split()))&lt;br /&gt;
    return n, parinti, None&lt;br /&gt;
&lt;br /&gt;
def scrie_noduri_pe_nivele_pare(file_path, nivele_pare):&lt;br /&gt;
    with open(file_path, &#039;w&#039;) as file:&lt;br /&gt;
        for nivel in nivele_pare:&lt;br /&gt;
            file.write(&#039; &#039;.join(map(str, nivel)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def noduri_pe_nivele_pare(n, parinti):&lt;br /&gt;
    nivele_pare = [[] for _ in range(n)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        parinte = parinti[i]&lt;br /&gt;
        nivel = 0&lt;br /&gt;
        while parinte != 0:&lt;br /&gt;
            nivel += 1&lt;br /&gt;
            parinte = parinti[parinte - 1]&lt;br /&gt;
&lt;br /&gt;
        if nivel % 2 == 0:&lt;br /&gt;
            nivele_pare[nivel // 2].append(i + 1)&lt;br /&gt;
&lt;br /&gt;
    return nivele_pare&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    input_file = &amp;quot;nivelepareIN.txt&amp;quot;&lt;br /&gt;
    output_file = &amp;quot;nivelepareOUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    n, parinti, restrictii_msg = citeste_arbore_din_fisier(input_file)&lt;br /&gt;
&lt;br /&gt;
    if restrictii_msg:&lt;br /&gt;
        with open(output_file, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(restrictii_msg)&lt;br /&gt;
    else:&lt;br /&gt;
        nivele_pare = noduri_pe_nivele_pare(n, parinti)&lt;br /&gt;
        scrie_noduri_pe_nivele_pare(output_file, nivele_pare)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0639_%E2%80%93_%C3%8En%C4%83l%C8%9Bime&amp;diff=8409</id>
		<title>0639 – Înălțime</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0639_%E2%80%93_%C3%8En%C4%83l%C8%9Bime&amp;diff=8409"/>
		<updated>2023-12-26T21:55:31Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: == Enunț == Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, etc. Numărul de nivele distincte din arbore determină înălțimea arborelui.  = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați înălțimea arborelui.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;inaltimeIN.txt&amp;lt;/code&amp;gt; con...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, etc. Numărul de nivele distincte din arbore determină înălțimea arborelui.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri. Determinați înălțimea arborelui.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;inaltimeIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;inaltimeOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; , reprezentând înălțimea arborelui.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplu 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;inaltimeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;inaltimeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
= Exemplu 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;inaltimeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&amp;lt;code&amp;gt;inaltimeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 100:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        with open(&amp;quot;inaltimeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def calculeaza_inaltimea(n, tati):&lt;br /&gt;
    if not verifica_restrictii(n):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    inaltime = 0&lt;br /&gt;
    nivele = [0] * n&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        nivel = 0&lt;br /&gt;
        j = i&lt;br /&gt;
        while tati[j] != 0:&lt;br /&gt;
            nivel += 1&lt;br /&gt;
            j = tati[j] - 1&lt;br /&gt;
            if nivele[j] != 0:&lt;br /&gt;
                nivel += nivele[j]&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
        nivele[i] = nivel&lt;br /&gt;
        inaltime = max(inaltime, nivel + 1)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;inaltimeOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file:&lt;br /&gt;
        file.write(str(inaltime))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    with open(&amp;quot;inaltimeIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as file:&lt;br /&gt;
        n = int(file.readline())&lt;br /&gt;
        if not verifica_restrictii(n):&lt;br /&gt;
            return&lt;br /&gt;
        tati = list(map(int, file.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Calcularea inaltimii arborelui&lt;br /&gt;
    calculeaza_inaltimea(n, tati)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2749_%E2%80%93_Tat%C4%83&amp;diff=8408</id>
		<title>2749 – Tată</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2749_%E2%80%93_Tat%C4%83&amp;diff=8408"/>
		<updated>2023-12-26T21:42:58Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Se dă un vector &amp;lt;code&amp;gt;t=(t[1], t[2], ..., t[n])&amp;lt;/code&amp;gt; care memorează numere naturale cuprinse între &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Să se verifice dacă &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar apoi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale, separate prin spații.  = Date de ieșire = Programul va afișa pe ecran mesajul &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;, dacă...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un vector &amp;lt;code&amp;gt;t=(t[1], t[2], ..., t[n])&amp;lt;/code&amp;gt; care memorează numere naturale cuprinse între &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Să se verifice dacă &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; este sau nu vector de tați asociat unui arbore cu rădăcină.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar apoi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran mesajul &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;, dacă &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; este vector de tați, sau mesajul &amp;lt;code&amp;gt;NU&amp;lt;/code&amp;gt; în caz contrar.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ t[i] ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5&lt;br /&gt;
 0 1 1 3 3&lt;br /&gt;
Ieșire&lt;br /&gt;
 DA&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5&lt;br /&gt;
 2 0 2 5 4&lt;br /&gt;
Ieșire&lt;br /&gt;
 NU&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Nodul &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; are ca tată pe &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, iar nodul &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; are ca tată pe &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 100001&lt;br /&gt;
Consola&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def sunt_restrictii_incorecte(n, t):&lt;br /&gt;
    # Verifică restricțiile pentru n&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    # Verifică restricțiile pentru t[i]&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if not (0 &amp;lt;= t[i] &amp;lt;= n):&lt;br /&gt;
            return True&lt;br /&gt;
&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def este_vector_de_tati(t):&lt;br /&gt;
    n = len(t)&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă restricțiile sunt respectate&lt;br /&gt;
    if sunt_restrictii_incorecte(n, t):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă rădăcina arborelui este corectă&lt;br /&gt;
    if t[0] != 0:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verifică dacă fiecare element al vectorului este un index valid&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if not (0 &amp;lt;= t[i] &amp;lt; n):&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
# Citeste numarul n&lt;br /&gt;
n = int(input(&amp;quot;Introduceti numarul n: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
# Ieși din program dacă restricțiile pentru n nu sunt respectate&lt;br /&gt;
if n &amp;lt; 1 or n &amp;gt; 100000:&lt;br /&gt;
    print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
else:&lt;br /&gt;
    # Citeste vectorul t&lt;br /&gt;
    t = list(map(int, input(&amp;quot;Introduceti vectorul t: &amp;quot;).split()))&lt;br /&gt;
&lt;br /&gt;
    # Verifica daca restrictiile sunt respectate si afiseaza mesajul corespunzator&lt;br /&gt;
    if sunt_restrictii_incorecte(n, t):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        # Verifica daca t este vector de tati si afiseaza rezultatul&lt;br /&gt;
        if este_vector_de_tati(t):&lt;br /&gt;
            print(&amp;quot;DA&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;NU&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4167_%E2%80%93_Fl%C8%99iElimin%C4%83&amp;diff=8407</id>
		<title>4167 – FlșiElimină</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4167_%E2%80%93_Fl%C8%99iElimin%C4%83&amp;diff=8407"/>
		<updated>2023-12-26T21:35:59Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră o listă liniară simplu înlănțuită, alocată dinamic, în care elementele sunt de tipul declarat mai jos:&lt;br /&gt;
 struct Nod&lt;br /&gt;
 {&lt;br /&gt;
     int info;&lt;br /&gt;
     Nod *leg;&lt;br /&gt;
 };&lt;br /&gt;
în care câmpul &amp;lt;code&amp;gt;info&amp;lt;/code&amp;gt; memorează un număr întreg, iar câmpul &amp;lt;code&amp;gt;leg&amp;lt;/code&amp;gt; memorează adresa următorului element al listei.&lt;br /&gt;
&lt;br /&gt;
= Cerinţa =&lt;br /&gt;
Să se scrie o funcție C++ cu următorul prototip:&lt;br /&gt;
 void FLsiElimina(Nod * &amp;amp;head);&lt;br /&gt;
care, în lista pentru care primul element are adresa memorată în pointerul &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;, elimină toate nodurile cuprinse între cel mai din stânga nod care memorează un număr divizibil cu &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și cel mai din dreapta nod care memorează un număr divizibil cu &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, inclusiv acestea. Se garantează că lista va conține cel puțin două noduri care au informația divizibilă cu &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. Dacă se elimină toate nodurile, atunci după apelul funcției trebuie ca &amp;lt;code&amp;gt;head = NULL&amp;lt;/code&amp;gt;. De exemplu, dacă lista conține inițial informațiile &amp;lt;code&amp;gt;1,27,3,4,13,12,44,23&amp;lt;/code&amp;gt;, atunci la final lista va fi: &amp;lt;code&amp;gt;1,44,23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Important =&lt;br /&gt;
Soluţia propusă va conţine definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
class Nod:&lt;br /&gt;
    def __init__(self, info):&lt;br /&gt;
        self.info = info&lt;br /&gt;
        self.leg = None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def FLsiElimina(head):&lt;br /&gt;
    # Cautăm primul nod cu informația divizibilă cu 3&lt;br /&gt;
    primul_nod = None&lt;br /&gt;
    nod_curent = head&lt;br /&gt;
&lt;br /&gt;
    while nod_curent is not None and nod_curent.info % 3 != 0:&lt;br /&gt;
        primul_nod = nod_curent&lt;br /&gt;
        nod_curent = nod_curent.leg&lt;br /&gt;
&lt;br /&gt;
    # Cautăm ultimul nod cu informația divizibilă cu 3&lt;br /&gt;
    ultimul_nod = None&lt;br /&gt;
    nod_curent = head&lt;br /&gt;
    while nod_curent is not None:&lt;br /&gt;
        if nod_curent.info % 3 == 0:&lt;br /&gt;
            ultimul_nod = nod_curent&lt;br /&gt;
        nod_curent = nod_curent.leg&lt;br /&gt;
&lt;br /&gt;
    # Eliminăm nodurile cuprinse între primul_nod și ultimul_nod, inclusiv acestea&lt;br /&gt;
    nod_curent = head&lt;br /&gt;
    while nod_curent is not None and nod_curent != primul_nod:&lt;br /&gt;
        nod_urmator = nod_curent.leg&lt;br /&gt;
        del nod_curent&lt;br /&gt;
        nod_curent = nod_urmator&lt;br /&gt;
&lt;br /&gt;
    if primul_nod is not None:&lt;br /&gt;
        primul_nod.leg = ultimul_nod.leg&lt;br /&gt;
        nod_curent = ultimul_nod.leg&lt;br /&gt;
        while nod_curent is not None:&lt;br /&gt;
            nod_urmator = nod_curent.leg&lt;br /&gt;
            del nod_curent&lt;br /&gt;
            nod_curent = nod_urmator&lt;br /&gt;
    else:&lt;br /&gt;
        # Dacă primul_nod este None, eliminăm toate nodurile de la început până la ultimul_nod&lt;br /&gt;
        head = ultimul_nod.leg&lt;br /&gt;
        nod_curent = ultimul_nod.leg&lt;br /&gt;
        while nod_curent is not None:&lt;br /&gt;
            nod_urmator = nod_curent.leg&lt;br /&gt;
            del nod_curent&lt;br /&gt;
            nod_curent = nod_urmator&lt;br /&gt;
&lt;br /&gt;
    return head&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcție de afișare a listei&lt;br /&gt;
def afisare_lista(head):&lt;br /&gt;
    while head is not None:&lt;br /&gt;
        print(head.info, end=&amp;quot; &amp;quot;)&lt;br /&gt;
        head = head.leg&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
head = Nod(1)&lt;br /&gt;
head.leg = Nod(27)&lt;br /&gt;
head.leg.leg = Nod(3)&lt;br /&gt;
head.leg.leg.leg = Nod(4)&lt;br /&gt;
head.leg.leg.leg.leg = Nod(13)&lt;br /&gt;
head.leg.leg.leg.leg.leg = Nod(12)&lt;br /&gt;
head.leg.leg.leg.leg.leg.leg = Nod(44)&lt;br /&gt;
head.leg.leg.leg.leg.leg.leg.leg = Nod(23)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Lista initiala:&amp;quot;, end=&amp;quot; &amp;quot;)&lt;br /&gt;
afisare_lista(head)&lt;br /&gt;
&lt;br /&gt;
head = FLsiElimina(head)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Lista finala:&amp;quot;, end=&amp;quot; &amp;quot;)&lt;br /&gt;
afisare_lista(head)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0636_%E2%80%93_Arbore&amp;diff=8406</id>
		<title>0636 – Arbore</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0636_%E2%80%93_Arbore&amp;diff=8406"/>
		<updated>2023-12-26T21:35:38Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dau cele &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; muchii ale unui arbore cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; . Afișați vectorul de tați al arborelui cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;arboreIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n k&amp;lt;/code&amp;gt;, Următoarele &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; linii vor conține câte o pereche &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, reprezentând muchiile arborelui.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;arboreOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie elementele vectorului de tați al arborelui cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, separate printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 : =&lt;br /&gt;
&amp;lt;code&amp;gt;arboreIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 4&lt;br /&gt;
 1 2&lt;br /&gt;
 1 4&lt;br /&gt;
 1 7&lt;br /&gt;
 3 7&lt;br /&gt;
 5 7&lt;br /&gt;
 6 7&lt;br /&gt;
&amp;lt;code&amp;gt;arboreOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 : =&lt;br /&gt;
&amp;lt;code&amp;gt;arboreIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1000 1001&lt;br /&gt;
 1 2&lt;br /&gt;
 1 4&lt;br /&gt;
 1 7&lt;br /&gt;
 3 7&lt;br /&gt;
 5 7&lt;br /&gt;
 6 7&lt;br /&gt;
&amp;lt;code&amp;gt;arboreOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, k, muchii):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not (1 &amp;lt;= k &amp;lt;= n) or len(muchii) != n - 1:&lt;br /&gt;
        with open(&amp;quot;arboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
            file_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    # Verifică dacă nodurile din muchii sunt în intervalul corect&lt;br /&gt;
    for muchie in muchii:&lt;br /&gt;
        if not (1 &amp;lt;= muchie[0] &amp;lt;= n) or not (1 &amp;lt;= muchie[1] &amp;lt;= n):&lt;br /&gt;
            with open(&amp;quot;arboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
                file_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dfs(nod, parinte, graf, rezultat):&lt;br /&gt;
    rezultat[nod] = parinte&lt;br /&gt;
    for vecin in graf[nod]:&lt;br /&gt;
        if vecin != parinte:&lt;br /&gt;
            dfs(vecin, nod, graf, rezultat)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    with open(&amp;quot;arboreIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as file_in:&lt;br /&gt;
        n, k = map(int, file_in.readline().split())&lt;br /&gt;
        muchii = [tuple(map(int, file_in.readline().split())) for _ in range(n - 1)]&lt;br /&gt;
&lt;br /&gt;
    # Verificarea restricțiilor&lt;br /&gt;
    if not verifica_restrictii(n, k, muchii):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Construirea grafului&lt;br /&gt;
    graf = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
    for muchie in muchii:&lt;br /&gt;
        graf[muchie[0]].append(muchie[1])&lt;br /&gt;
        graf[muchie[1]].append(muchie[0])&lt;br /&gt;
&lt;br /&gt;
    # Inițializarea vectorului de tați cu 0&lt;br /&gt;
    parinti = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    # Apelarea algoritmului DFS&lt;br /&gt;
    dfs(k, 0, graf, parinti)&lt;br /&gt;
&lt;br /&gt;
    # Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;arboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
        file_out.write(&amp;quot; &amp;quot;.join(map(str, parinti[1:])))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0652_%E2%80%93_Afi%C8%99are_Fii&amp;diff=8405</id>
		<title>0652 – Afișare Fii</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0652_%E2%80%93_Afi%C8%99are_Fii&amp;diff=8405"/>
		<updated>2023-12-26T21:35:18Z</updated>

		<summary type="html">&lt;p&gt;Simina: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri distincte din arbore. Afișați fiii fiecăruia dintre cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;afisarefiiIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații. Linia a trei conține numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar linia a patra &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri, &amp;lt;code&amp;gt;x[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x[2]&amp;lt;/code&amp;gt;, … , &amp;lt;code&amp;gt;x[k]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;afisarefiiOUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii. Linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; va conține numărul de fii ai lui &amp;lt;code&amp;gt;x[i]&amp;lt;/code&amp;gt; urmat de un spațiu și de lista fiilor lui &amp;lt;code&amp;gt;x[i]&amp;lt;/code&amp;gt;, separați și ei printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* dacă un nod &amp;lt;code&amp;gt;x[i]&amp;lt;/code&amp;gt; nu are fii, linia corespunzătoare din fișierul de ieșire va contine doar valoarea &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;afisarefiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
 4&lt;br /&gt;
 3 4 7 1&lt;br /&gt;
&amp;lt;code&amp;gt;afisarefiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 2 4 &lt;br /&gt;
 1 1 &lt;br /&gt;
 0 &lt;br /&gt;
 2 6 8 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;afisarefiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
 4&lt;br /&gt;
 3 4 7 1&lt;br /&gt;
&amp;lt;code&amp;gt;afisarefiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= k &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
def afisare_fii(n, tati, k, noduri_selectate):&lt;br /&gt;
    restrictii_mesaj = verifica_restrictii(n, k)&lt;br /&gt;
    if restrictii_mesaj:&lt;br /&gt;
        return restrictii_mesaj&lt;br /&gt;
&lt;br /&gt;
    rezultat = []&lt;br /&gt;
&lt;br /&gt;
    for nod in noduri_selectate:&lt;br /&gt;
        if not (1 &amp;lt;= nod &amp;lt;= n):&lt;br /&gt;
            return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        fii = [i for i, parinte in enumerate(tati, 1) if parinte == nod]&lt;br /&gt;
        rezultat.append((len(fii), fii))&lt;br /&gt;
&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
with open(&amp;quot;afisarefiiIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
    n = int(f.readline().strip())&lt;br /&gt;
    tati = list(map(int, f.readline().strip().split()))&lt;br /&gt;
    k = int(f.readline().strip())&lt;br /&gt;
    noduri_selectate = list(map(int, f.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
# Verificarea restricțiilor și obținerea rezultatului&lt;br /&gt;
restrictii_mesaj = verifica_restrictii(n, k)&lt;br /&gt;
if restrictii_mesaj:&lt;br /&gt;
    with open(&amp;quot;afisarefiiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(restrictii_mesaj)&lt;br /&gt;
else:&lt;br /&gt;
    rezultat = afisare_fii(n, tati, k, noduri_selectate)&lt;br /&gt;
    with open(&amp;quot;afisarefiiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        if isinstance(rezultat, str):&lt;br /&gt;
            f.write(rezultat)&lt;br /&gt;
        else:&lt;br /&gt;
            for nr_fii, fii in rezultat:&lt;br /&gt;
                f.write(f&amp;quot;{nr_fii} {&#039; &#039;.join(map(str, fii))}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0638_%E2%80%93_Nivele&amp;diff=8404</id>
		<title>0638 – Nivele</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0638_%E2%80%93_Nivele&amp;diff=8404"/>
		<updated>2023-12-26T21:34:36Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: == Enunț == Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, etc.  = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri din arbore. Determinați pentru fiecare dintre cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri nivelul pe care se află.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;niveleIN.txt&amp;lt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, fiii rădăcinii pe nivelul &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, fiii fiilor rădăcinii pe nivelul &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri din arbore. Determinați pentru fiecare dintre cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri nivelul pe care se află.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;niveleIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații. Linia a treia conține numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar linia a patra &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri, &amp;lt;code&amp;gt;x[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x[2]&amp;lt;/code&amp;gt;, … , &amp;lt;code&amp;gt;x[k]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;niveleOUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii. Linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; va conține nivelul pe care se află nodul &amp;lt;code&amp;gt;x[i]&amp;lt;/code&amp;gt; în arborele dat&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;niveleIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
 4&lt;br /&gt;
 1 3 4 7&lt;br /&gt;
&amp;lt;code&amp;gt;niveleOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
 4&lt;br /&gt;
 1&lt;br /&gt;
 3 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;niveleIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
 4&lt;br /&gt;
 1 3 4 7&lt;br /&gt;
&amp;lt;code&amp;gt;niveleOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, k, tati):&lt;br /&gt;
    if not(1 &amp;lt;= k &amp;lt;= n &amp;lt;= 100) or tati.count(0) != 1:&lt;br /&gt;
        with open(&amp;quot;niveleOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f_out:&lt;br /&gt;
            f_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def determina_nivelul(n, tati, k, noduri):&lt;br /&gt;
    # Verificare pentru restricții&lt;br /&gt;
    if not verifica_restrictii(n, k, tati):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    nivele = [0] * n  # nivelele pentru fiecare nod&lt;br /&gt;
    radacina = tati.index(0) + 1  # găsim poziția rădăcinii în vectorul de tați&lt;br /&gt;
&lt;br /&gt;
    def dfs(nod, nivel):&lt;br /&gt;
        nivele[nod - 1] = nivel  # nodurile sunt numerotate de la 1, așa că indexăm cu nod-1&lt;br /&gt;
        for fiu in range(1, n + 1):&lt;br /&gt;
            if tati[fiu - 1] == nod:&lt;br /&gt;
                dfs(fiu, nivel + 1)&lt;br /&gt;
&lt;br /&gt;
    dfs(radacina, 1)&lt;br /&gt;
&lt;br /&gt;
    rezultate = [nivele[nod - 1] for nod in noduri]&lt;br /&gt;
&lt;br /&gt;
    # Scrierea rezultatelor în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;niveleOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f_out:&lt;br /&gt;
        for rezultat in rezultate:&lt;br /&gt;
            f_out.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
with open(&amp;quot;niveleIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
    n = int(f.readline().strip())&lt;br /&gt;
    tati = list(map(int, f.readline().split()))&lt;br /&gt;
    k = int(f.readline().strip())&lt;br /&gt;
    noduri = list(map(int, f.readline().split()))&lt;br /&gt;
&lt;br /&gt;
# Determinarea nivelului pentru fiecare nod dat&lt;br /&gt;
determina_nivelul(n, tati, k, noduri)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0652_%E2%80%93_Afi%C8%99are_Fii&amp;diff=8403</id>
		<title>0652 – Afișare Fii</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0652_%E2%80%93_Afi%C8%99are_Fii&amp;diff=8403"/>
		<updated>2023-12-26T21:29:55Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri distincte din arbore. Afișați fiii fiecăruia dintre cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;afisarefiiIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații. Linia a trei conține numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, i...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri distincte din arbore. Afișați fiii fiecăruia dintre cele &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;afisarefiiIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul de noduri &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații. Linia a trei conține numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar linia a patra &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; noduri, &amp;lt;code&amp;gt;x[1]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x[2]&amp;lt;/code&amp;gt;, … , &amp;lt;code&amp;gt;x[k]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;afisarefiiOUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii. Linia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; va conține numărul de fii ai lui &amp;lt;code&amp;gt;x[i]&amp;lt;/code&amp;gt; urmat de un spațiu și de lista fiilor lui &amp;lt;code&amp;gt;x[i]&amp;lt;/code&amp;gt;, separați și ei printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* dacă un nod &amp;lt;code&amp;gt;x[i]&amp;lt;/code&amp;gt; nu are fii, linia corespunzătoare din fișierul de ieșire va contine doar valoarea &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;afisarefiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
 4&lt;br /&gt;
 3 4 7 1&lt;br /&gt;
&amp;lt;code&amp;gt;afisarefiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 2 4 &lt;br /&gt;
 1 1 &lt;br /&gt;
 0 &lt;br /&gt;
 2 6 8 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;afisarefiiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 4 3 0 3 2 1 2 1&lt;br /&gt;
 4&lt;br /&gt;
 3 4 7 1&lt;br /&gt;
&amp;lt;code&amp;gt;afisarefiiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, k):&lt;br /&gt;
    if not (1 &amp;lt;= k &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
def afisare_fii(n, tati, k, noduri_selectate):&lt;br /&gt;
    restrictii_mesaj = verifica_restrictii(n, k)&lt;br /&gt;
    if restrictii_mesaj:&lt;br /&gt;
        return restrictii_mesaj&lt;br /&gt;
&lt;br /&gt;
    rezultat = []&lt;br /&gt;
&lt;br /&gt;
    for nod in noduri_selectate:&lt;br /&gt;
        if not (1 &amp;lt;= nod &amp;lt;= n):&lt;br /&gt;
            return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        fii = [i for i, parinte in enumerate(tati, 1) if parinte == nod]&lt;br /&gt;
        rezultat.append((len(fii), fii))&lt;br /&gt;
&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
# Citirea datelor de intrare&lt;br /&gt;
with open(&amp;quot;afisarefiiIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
    n = int(f.readline().strip())&lt;br /&gt;
    tati = list(map(int, f.readline().strip().split()))&lt;br /&gt;
    k = int(f.readline().strip())&lt;br /&gt;
    noduri_selectate = list(map(int, f.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
# Verificarea restricțiilor și obținerea rezultatului&lt;br /&gt;
restrictii_mesaj = verifica_restrictii(n, k)&lt;br /&gt;
if restrictii_mesaj:&lt;br /&gt;
    with open(&amp;quot;afisarefiiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(restrictii_mesaj)&lt;br /&gt;
else:&lt;br /&gt;
    rezultat = afisare_fii(n, tati, k, noduri_selectate)&lt;br /&gt;
    with open(&amp;quot;afisarefiiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        if isinstance(rezultat, str):&lt;br /&gt;
            f.write(rezultat)&lt;br /&gt;
        else:&lt;br /&gt;
            for nr_fii, fii in rezultat:&lt;br /&gt;
                f.write(f&amp;quot;{nr_fii} {&#039; &#039;.join(map(str, fii))}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0636_%E2%80%93_Arbore&amp;diff=8402</id>
		<title>0636 – Arbore</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0636_%E2%80%93_Arbore&amp;diff=8402"/>
		<updated>2023-12-26T21:24:40Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: = Cerința = Se dau cele &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; muchii ale unui arbore cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; . Afișați vectorul de tați al arborelui cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;arboreIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n k&amp;lt;/code&amp;gt;, Următoarele &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; linii vor conține câte o pereche &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, reprezentând muchiile arborelui.  = Date de ieșire = Fișierul de ieșire &amp;lt;code&amp;gt;arb...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dau cele &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; muchii ale unui arbore cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un nod &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; . Afișați vectorul de tați al arborelui cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;arboreIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n k&amp;lt;/code&amp;gt;, Următoarele &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; linii vor conține câte o pereche &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, reprezentând muchiile arborelui.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;arboreOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie elementele vectorului de tați al arborelui cu rădăcina în &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, separate printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* în vectorul de tați rădăcina este marcată cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1 : =&lt;br /&gt;
&amp;lt;code&amp;gt;arboreIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 4&lt;br /&gt;
 1 2&lt;br /&gt;
 1 4&lt;br /&gt;
 1 7&lt;br /&gt;
 3 7&lt;br /&gt;
 5 7&lt;br /&gt;
 6 7&lt;br /&gt;
&amp;lt;code&amp;gt;arboreOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 1 7 0 7 7 1 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2 : =&lt;br /&gt;
&amp;lt;code&amp;gt;arboreIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1000 1001&lt;br /&gt;
 1 2&lt;br /&gt;
 1 4&lt;br /&gt;
 1 7&lt;br /&gt;
 3 7&lt;br /&gt;
 5 7&lt;br /&gt;
 6 7&lt;br /&gt;
&amp;lt;code&amp;gt;arboreOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Datele nu corespund restrictiilor impuse&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
def verifica_restrictii(n, k, muchii):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not (1 &amp;lt;= k &amp;lt;= n) or len(muchii) != n - 1:&lt;br /&gt;
        with open(&amp;quot;arboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
            file_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    # Verifică dacă nodurile din muchii sunt în intervalul corect&lt;br /&gt;
    for muchie in muchii:&lt;br /&gt;
        if not (1 &amp;lt;= muchie[0] &amp;lt;= n) or not (1 &amp;lt;= muchie[1] &amp;lt;= n):&lt;br /&gt;
            with open(&amp;quot;arboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
                file_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dfs(nod, parinte, graf, rezultat):&lt;br /&gt;
    rezultat[nod] = parinte&lt;br /&gt;
    for vecin in graf[nod]:&lt;br /&gt;
        if vecin != parinte:&lt;br /&gt;
            dfs(vecin, nod, graf, rezultat)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea datelor de intrare&lt;br /&gt;
    with open(&amp;quot;arboreIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as file_in:&lt;br /&gt;
        n, k = map(int, file_in.readline().split())&lt;br /&gt;
        muchii = [tuple(map(int, file_in.readline().split())) for _ in range(n - 1)]&lt;br /&gt;
&lt;br /&gt;
    # Verificarea restricțiilor&lt;br /&gt;
    if not verifica_restrictii(n, k, muchii):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Construirea grafului&lt;br /&gt;
    graf = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
    for muchie in muchii:&lt;br /&gt;
        graf[muchie[0]].append(muchie[1])&lt;br /&gt;
        graf[muchie[1]].append(muchie[0])&lt;br /&gt;
&lt;br /&gt;
    # Inițializarea vectorului de tați cu 0&lt;br /&gt;
    parinti = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    # Apelarea algoritmului DFS&lt;br /&gt;
    dfs(k, 0, graf, parinti)&lt;br /&gt;
&lt;br /&gt;
    # Scrierea rezultatului în fișierul de ieșire&lt;br /&gt;
    with open(&amp;quot;arboreOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
        file_out.write(&amp;quot; &amp;quot;.join(map(str, parinti[1:])))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4167_%E2%80%93_Fl%C8%99iElimin%C4%83&amp;diff=8401</id>
		<title>4167 – FlșiElimină</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4167_%E2%80%93_Fl%C8%99iElimin%C4%83&amp;diff=8401"/>
		<updated>2023-12-26T21:12:23Z</updated>

		<summary type="html">&lt;p&gt;Simina: Pagină nouă: Se consideră o listă liniară simplu înlănțuită, alocată dinamic, în care elementele sunt de tipul declarat mai jos:  struct Nod  {      int info;      Nod *leg;  }; în care câmpul &amp;lt;code&amp;gt;info&amp;lt;/code&amp;gt; memorează un număr întreg, iar câmpul &amp;lt;code&amp;gt;leg&amp;lt;/code&amp;gt; memorează adresa următorului element al listei.  = Cerinţa = Să se scrie o funcție C++ cu următorul prototip:  void FLsiElimina(Nod * &amp;amp;head); care, în lista pentru care primul element are adresa memorată...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Se consideră o listă liniară simplu înlănțuită, alocată dinamic, în care elementele sunt de tipul declarat mai jos:&lt;br /&gt;
 struct Nod&lt;br /&gt;
 {&lt;br /&gt;
     int info;&lt;br /&gt;
     Nod *leg;&lt;br /&gt;
 };&lt;br /&gt;
în care câmpul &amp;lt;code&amp;gt;info&amp;lt;/code&amp;gt; memorează un număr întreg, iar câmpul &amp;lt;code&amp;gt;leg&amp;lt;/code&amp;gt; memorează adresa următorului element al listei.&lt;br /&gt;
&lt;br /&gt;
= Cerinţa =&lt;br /&gt;
Să se scrie o funcție C++ cu următorul prototip:&lt;br /&gt;
 void FLsiElimina(Nod * &amp;amp;head);&lt;br /&gt;
care, în lista pentru care primul element are adresa memorată în pointerul &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;, elimină toate nodurile cuprinse între cel mai din stânga nod care memorează un număr divizibil cu &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; și cel mai din dreapta nod care memorează un număr divizibil cu &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, inclusiv acestea. Se garantează că lista va conține cel puțin două noduri care au informația divizibilă cu &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. Dacă se elimină toate nodurile, atunci după apelul funcției trebuie ca &amp;lt;code&amp;gt;head = NULL&amp;lt;/code&amp;gt;. De exemplu, dacă lista conține inițial informațiile &amp;lt;code&amp;gt;1,27,3,4,13,12,44,23&amp;lt;/code&amp;gt;, atunci la final lista va fi: &amp;lt;code&amp;gt;1,44,23&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Important =&lt;br /&gt;
Soluţia propusă va conţine definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
class Nod:&lt;br /&gt;
    def __init__(self, info):&lt;br /&gt;
        self.info = info&lt;br /&gt;
        self.leg = None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def FLsiElimina(head):&lt;br /&gt;
    # Cautăm primul nod cu informația divizibilă cu 3&lt;br /&gt;
    primul_nod = None&lt;br /&gt;
    nod_curent = head&lt;br /&gt;
&lt;br /&gt;
    while nod_curent is not None and nod_curent.info % 3 != 0:&lt;br /&gt;
        primul_nod = nod_curent&lt;br /&gt;
        nod_curent = nod_curent.leg&lt;br /&gt;
&lt;br /&gt;
    # Cautăm ultimul nod cu informația divizibilă cu 3&lt;br /&gt;
    ultimul_nod = None&lt;br /&gt;
    nod_curent = head&lt;br /&gt;
    while nod_curent is not None:&lt;br /&gt;
        if nod_curent.info % 3 == 0:&lt;br /&gt;
            ultimul_nod = nod_curent&lt;br /&gt;
        nod_curent = nod_curent.leg&lt;br /&gt;
&lt;br /&gt;
    # Eliminăm nodurile cuprinse între primul_nod și ultimul_nod, inclusiv acestea&lt;br /&gt;
    nod_curent = head&lt;br /&gt;
    while nod_curent is not None and nod_curent != primul_nod:&lt;br /&gt;
        nod_urmator = nod_curent.leg&lt;br /&gt;
        del nod_curent&lt;br /&gt;
        nod_curent = nod_urmator&lt;br /&gt;
&lt;br /&gt;
    if primul_nod is not None:&lt;br /&gt;
        primul_nod.leg = ultimul_nod.leg&lt;br /&gt;
        nod_curent = ultimul_nod.leg&lt;br /&gt;
        while nod_curent is not None:&lt;br /&gt;
            nod_urmator = nod_curent.leg&lt;br /&gt;
            del nod_curent&lt;br /&gt;
            nod_curent = nod_urmator&lt;br /&gt;
    else:&lt;br /&gt;
        # Dacă primul_nod este None, eliminăm toate nodurile de la început până la ultimul_nod&lt;br /&gt;
        head = ultimul_nod.leg&lt;br /&gt;
        nod_curent = ultimul_nod.leg&lt;br /&gt;
        while nod_curent is not None:&lt;br /&gt;
            nod_urmator = nod_curent.leg&lt;br /&gt;
            del nod_curent&lt;br /&gt;
            nod_curent = nod_urmator&lt;br /&gt;
&lt;br /&gt;
    return head&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcție de afișare a listei&lt;br /&gt;
def afisare_lista(head):&lt;br /&gt;
    while head is not None:&lt;br /&gt;
        print(head.info, end=&amp;quot; &amp;quot;)&lt;br /&gt;
        head = head.leg&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
head = Nod(1)&lt;br /&gt;
head.leg = Nod(27)&lt;br /&gt;
head.leg.leg = Nod(3)&lt;br /&gt;
head.leg.leg.leg = Nod(4)&lt;br /&gt;
head.leg.leg.leg.leg = Nod(13)&lt;br /&gt;
head.leg.leg.leg.leg.leg = Nod(12)&lt;br /&gt;
head.leg.leg.leg.leg.leg.leg = Nod(44)&lt;br /&gt;
head.leg.leg.leg.leg.leg.leg.leg = Nod(23)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Lista initiala:&amp;quot;, end=&amp;quot; &amp;quot;)&lt;br /&gt;
afisare_lista(head)&lt;br /&gt;
&lt;br /&gt;
head = FLsiElimina(head)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Lista finala:&amp;quot;, end=&amp;quot; &amp;quot;)&lt;br /&gt;
afisare_lista(head)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simina</name></author>
	</entry>
</feed>