<?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=Rus+Marius</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=Rus+Marius"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/Rus_Marius"/>
	<updated>2026-06-17T05:05:41Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0400_-_Pachete&amp;diff=9168</id>
		<title>0400 - Pachete</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0400_-_Pachete&amp;diff=9168"/>
		<updated>2024-01-07T11:28:28Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = Într-un depozit există un raft cu &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; spații de depozitare, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt;. Primele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; spatii de depozitare sunt ocupate cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; pachete numerotate cu valori între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar spațiul de depozitare &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; este gol.  Administratorul depozitului decide mutarea pachetelor, astfel încât pentru orice &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, pachetul numerotat cu &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; s...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Într-un depozit există un raft cu &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; spații de depozitare, numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt;. Primele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; spatii de depozitare sunt ocupate cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; pachete numerotate cu valori între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar spațiul de depozitare &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt; este gol.&lt;br /&gt;
&lt;br /&gt;
Administratorul depozitului decide mutarea pachetelor, astfel încât pentru orice &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, pachetul numerotat cu &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; să se afle în spațiul de depozitare &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Pentru aceasta se va folosi spațiul de depozitare suplimentar, &amp;lt;code&amp;gt;n+1&amp;lt;/code&amp;gt;, singura manevră validă fiind mutarea unui pachet dintr-un spațiu de depozitare în altul, cu condiția ca acesta să fie gol.&lt;br /&gt;
&lt;br /&gt;
Determinați o succesiune de manevre prin care fiecare pachet să fie în spațiul corect.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;pacheteIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale separate prin spaţii. Al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea număr reprezintă numărul pachetului aflat în spațiul de depozitare &amp;lt;code&amp;gt;i&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;pacheteOUT.txt&amp;lt;/code&amp;gt; va conţine pe prima linie numărul &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, reprezentând numărul de manevre efectuate. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se descrie o manevră, prin două numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația: se ia pachetul din spațiul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și se mută în spațiul &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.Î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 ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru fiecare manevră &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt; efectuată, &amp;lt;code&amp;gt;1 ≤ i,j ≤ n+1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;i ≠ j&amp;lt;/code&amp;gt;, iar spațiul &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; trebuie să fie gol&lt;br /&gt;
* numărul de manevre realizate nu trebuie să fie minim&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;pacheteIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
 2 5 4 3 1 &lt;br /&gt;
&amp;lt;code&amp;gt;pacheteOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7&lt;br /&gt;
 1 6&lt;br /&gt;
 5 1&lt;br /&gt;
 2 5&lt;br /&gt;
 6 2&lt;br /&gt;
 3 6&lt;br /&gt;
 4 3&lt;br /&gt;
 6 4&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Pachetele se vor muta în felul urmator.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|4&lt;br /&gt;
|3&lt;br /&gt;
|1&lt;br /&gt;
|_&lt;br /&gt;
|-&lt;br /&gt;
|_&lt;br /&gt;
|5&lt;br /&gt;
|4&lt;br /&gt;
|3&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|5&lt;br /&gt;
|4&lt;br /&gt;
|3&lt;br /&gt;
|_&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|_&lt;br /&gt;
|4&lt;br /&gt;
|3&lt;br /&gt;
|5&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|3&lt;br /&gt;
|5&lt;br /&gt;
|_&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|_&lt;br /&gt;
|3&lt;br /&gt;
|5&lt;br /&gt;
|4&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|_&lt;br /&gt;
|5&lt;br /&gt;
|4&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|3&lt;br /&gt;
|4&lt;br /&gt;
|5&lt;br /&gt;
|_&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;pacheteIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101&lt;br /&gt;
 2 5 4 3 1 &lt;br /&gt;
&amp;lt;code&amp;gt;pacheteOUT.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;
INFILE = &amp;quot;pacheteIN.txt&amp;quot;&lt;br /&gt;
OUTFILE = &amp;quot;pacheteOUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NMAX = 1000 * 100 + 1&lt;br /&gt;
&lt;br /&gt;
v = [0] * NMAX&lt;br /&gt;
p = [0] * NMAX&lt;br /&gt;
sol = [[0] * (NMAX * 2) for _ in range(2)]&lt;br /&gt;
&lt;br /&gt;
def check_constraints(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(OUTFILE, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
            outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global v, p, sol&lt;br /&gt;
    &lt;br /&gt;
    with open(INFILE, &amp;quot;r&amp;quot;) as infile:&lt;br /&gt;
        n = int(infile.readline())&lt;br /&gt;
        &lt;br /&gt;
        if not check_constraints(n):&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        v[1:n+1] = map(int, infile.readline().split())&lt;br /&gt;
        p = [0] * (n+1)&lt;br /&gt;
        &lt;br /&gt;
        p[0] = n + 1&lt;br /&gt;
        nr = 0&lt;br /&gt;
        &lt;br /&gt;
        for i in range(1, n+1):&lt;br /&gt;
            p[v[i]] = i&lt;br /&gt;
        &lt;br /&gt;
        for i in range(1, n+1):&lt;br /&gt;
            if v[i] == i:&lt;br /&gt;
                continue&lt;br /&gt;
            &lt;br /&gt;
            if p[0] != i:&lt;br /&gt;
                nr += 1&lt;br /&gt;
                sol[0][nr] = i&lt;br /&gt;
                sol[1][nr] = p[0]&lt;br /&gt;
                v[p[0]] = v[i]&lt;br /&gt;
                p[v[i]] = p[0]&lt;br /&gt;
                v[i] = 0&lt;br /&gt;
                p[0] = i&lt;br /&gt;
            &lt;br /&gt;
            nr += 1&lt;br /&gt;
            sol[0][nr] = p[i]&lt;br /&gt;
            sol[1][nr] = i&lt;br /&gt;
            v[i] = i&lt;br /&gt;
            v[p[i]] = 0&lt;br /&gt;
            p[0] = p[i]&lt;br /&gt;
            p[i] = i&lt;br /&gt;
        &lt;br /&gt;
        with open(OUTFILE, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
            outfile.write(f&amp;quot;{nr}\n&amp;quot;)&lt;br /&gt;
            for i in range(1, nr+1):&lt;br /&gt;
                outfile.write(f&amp;quot;{sol[0][i]} {sol[1][i]}\n&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0341_-_Bomboane&amp;diff=9167</id>
		<title>0341 - Bomboane</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0341_-_Bomboane&amp;diff=9167"/>
		<updated>2024-01-07T11:24:20Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = La magazinul din colț au fost aduse &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cutii, numerotate 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;, fiecare conținând un anumit număr de bomboane. Administratorul magazinului hotărăște, pentru bunul mers al afacerilor, că bomboanele trebuie rearanjate în cutii, astfel încât fiecare cutie să conțină același număr de bomboane. Pentru aceasta, administratorul magazinului realizează în mod repetat următoarea operație: mută un număr oare...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
La magazinul din colț au fost aduse &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cutii, numerotate 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;, fiecare conținând un anumit număr de bomboane. Administratorul magazinului hotărăște, pentru bunul mers al afacerilor, că bomboanele trebuie rearanjate în cutii, astfel încât fiecare cutie să conțină același număr de bomboane. Pentru aceasta, administratorul magazinului realizează în mod repetat următoarea operație: mută un număr oarecare de bomboane din cutia cu număr maxim de bomboane în cea cu număr minim de bomboane.&lt;br /&gt;
&lt;br /&gt;
Determinați un șir cu număr minim de operații prin care toate cutiile conțin același număr de bomboane.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;bomboaneIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale separate prin spaţii, reprezentând numărul de bomboane din fiecare cutie.&lt;br /&gt;
&lt;br /&gt;
= Date de ieşire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;bomboaneOUT.txt&amp;lt;/code&amp;gt; va conţine pe prima linie numărul &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, reprezentând numărul total de mutări. Următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii descriu mutările. Fiecare linie va conține câte trei numere &amp;lt;code&amp;gt;S D B&amp;lt;/code&amp;gt;, separate prin câte un spațiu, cu semnificația: din cutia &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; s-au mutat în cutia &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; un număr de &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; bomboane.&lt;br /&gt;
&lt;br /&gt;
= Restricţii şi precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* în fiecare cutie se află cel puțin una și cel mult &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt; de bomboane&lt;br /&gt;
* după efectuarea mutărilor numărul total de bomboane din cutii este același cu numărul total de bomboane de la început&lt;br /&gt;
* dacă nu este posibilă redistribuirea bomboanelor în condițiile date se va afișa pe prima linie a fișierului valoarea &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;&lt;br /&gt;
* administratorul magazinului bănuiește că aceasta nu este cea mai eficientă metodă de lucru, dar se mulțumește cu aceasta.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;bomboaneIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
 4 2 1 7 1&lt;br /&gt;
&amp;lt;code&amp;gt;bomboaneOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 4 3 2&lt;br /&gt;
 4 5 2&lt;br /&gt;
 1 2 1&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Se fac &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; operații:&lt;br /&gt;
&lt;br /&gt;
* se mută &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; bomboane din cutia &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; în cutia &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. Conținutul cutiilor va fi: &amp;lt;code&amp;gt;4 2 3 5 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* se mută &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; bomboane din cutia &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; în cutia &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. Conținutul cutiilor va fi: &amp;lt;code&amp;gt;4 2 3 3 3&amp;lt;/code&amp;gt;&lt;br /&gt;
* se mută o bomboană din cutia &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; în cutia &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;. Conținutul cutiilor va fi: &amp;lt;code&amp;gt;3 3 3 3 3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;bomboaneIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001&lt;br /&gt;
 4 2 1 7 1&lt;br /&gt;
&amp;lt;code&amp;gt;bomboaneOUT.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;
INFILE = &amp;quot;bomboaneIN.txt&amp;quot;&lt;br /&gt;
OUTFILE = &amp;quot;bomboaneOUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NMAX = 1000 + 1&lt;br /&gt;
VALMAX = 1000 + 1&lt;br /&gt;
&lt;br /&gt;
v = [0] * NMAX&lt;br /&gt;
p = [0] * NMAX&lt;br /&gt;
sol = [[0] * NMAX for _ in range(3)]&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 1000:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        with open(OUTFILE, &#039;w&#039;) as outfile:&lt;br /&gt;
            outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
with open(INFILE, &#039;r&#039;) as infile:&lt;br /&gt;
    n = int(infile.readline())&lt;br /&gt;
    &lt;br /&gt;
    if not check_constraints(n):&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
    v[1:n + 1] = map(int, infile.readline().split())&lt;br /&gt;
    p[1:n + 1] = range(1, n + 1)&lt;br /&gt;
    sum_val = sum(v[1:n + 1])&lt;br /&gt;
&lt;br /&gt;
    if sum_val % n != 0:&lt;br /&gt;
        with open(OUTFILE, &#039;w&#039;) as outfile:&lt;br /&gt;
            outfile.write(&amp;quot;-1&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
    ma = sum_val // n&lt;br /&gt;
    nr = 0&lt;br /&gt;
&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        min_val, max_val = VALMAX, 0&lt;br /&gt;
        p1, p2 = 0, 0&lt;br /&gt;
&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            if v[i] &amp;lt; min_val:&lt;br /&gt;
                min_val = v[i]&lt;br /&gt;
                p1 = i&lt;br /&gt;
            if v[i] &amp;gt; max_val:&lt;br /&gt;
                max_val = v[i]&lt;br /&gt;
                p2 = i&lt;br /&gt;
&lt;br /&gt;
        if max_val == ma:&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
        v[p2] -= ma - v[p1]&lt;br /&gt;
        nr += 1&lt;br /&gt;
        sol[0][nr] = p[p2]&lt;br /&gt;
        sol[1][nr] = p[p1]&lt;br /&gt;
        sol[2][nr] = ma - v[p1]&lt;br /&gt;
        v[p1] += ma - v[p1]&lt;br /&gt;
&lt;br /&gt;
        v[0] = 0&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            if v[i] != ma:&lt;br /&gt;
                v[0] += 1&lt;br /&gt;
                v[v[0]] = v[i]&lt;br /&gt;
                p[v[0]] = p[i]&lt;br /&gt;
&lt;br /&gt;
        n = v[0]&lt;br /&gt;
&lt;br /&gt;
    with open(OUTFILE, &#039;w&#039;) as outfile:&lt;br /&gt;
        outfile.write(f&amp;quot;{nr}\n&amp;quot;)&lt;br /&gt;
        for i in range(1, nr + 1):&lt;br /&gt;
            outfile.write(f&amp;quot;{sol[0][i]} {sol[1][i]} {sol[2][i]}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3919_-_Back_ME&amp;diff=9166</id>
		<title>3919 - Back ME</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3919_-_Back_ME&amp;diff=9166"/>
		<updated>2024-01-07T11:11:30Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Se citesc două numere naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;. Afișați în ordine lexicografică toate cuvintele care sunt formate din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; litere &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; litere &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; cu proprietatea că nu există mai mult de două litere &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; alăturate și nici mai mult de două litere &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; alăturate.  = Date de intrare = Programul citește de la tastatură numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, sepa...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se citesc două numere naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;. Afișați în ordine lexicografică toate cuvintele care sunt formate din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; litere &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; litere &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; cu proprietatea că nu există mai mult de două litere &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; alăturate și nici mai mult de două litere &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; alăturate.&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; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran pe linii separate cuvintele cerute.Î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;0 ≤ n ≤ 17&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0 ≤ m ≤ 17&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ n + m ≤ 28&amp;lt;/code&amp;gt;&lt;br /&gt;
* Dacă nu există cuvinte care să respecte condițiile, atunci se va afișa &amp;lt;code&amp;gt;IMPOSIBIL&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 3  3&lt;br /&gt;
Ieșire&lt;br /&gt;
 EEMEMM&lt;br /&gt;
 EEMMEM&lt;br /&gt;
 EMEEMM&lt;br /&gt;
 EMEMEM&lt;br /&gt;
 EMEMME&lt;br /&gt;
 EMMEEM&lt;br /&gt;
 EMMEME&lt;br /&gt;
 MEEMEM&lt;br /&gt;
 MEEMME&lt;br /&gt;
 MEMEEM&lt;br /&gt;
 MEMEME&lt;br /&gt;
 MEMMEE&lt;br /&gt;
 MMEEME&lt;br /&gt;
 MMEMEE&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 18 29&lt;br /&gt;
Ieșire&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 afisare(v, st, e, m):&lt;br /&gt;
    for i in range(1, e + m + 1):&lt;br /&gt;
        print(v[st[i]], end=&#039;&#039;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
def valid(v, st, k, e, m):&lt;br /&gt;
    for i in range(1, k - 1):&lt;br /&gt;
        if v[st[i]] == &#039;E&#039; and v[st[i + 1]] == &#039;E&#039; and v[st[i + 2]] == &#039;E&#039;:&lt;br /&gt;
            return False&lt;br /&gt;
        if v[st[i]] == &#039;M&#039; and v[st[i + 1]] == &#039;M&#039; and v[st[i + 2]] == &#039;M&#039;:&lt;br /&gt;
            return False&lt;br /&gt;
    if k == e + m:&lt;br /&gt;
        E, M = 0, 0&lt;br /&gt;
        for i in range(1, k + 1):&lt;br /&gt;
            if v[st[i]] == &#039;E&#039;:&lt;br /&gt;
                E += 1&lt;br /&gt;
            else:&lt;br /&gt;
                M += 1&lt;br /&gt;
        if E != e or M != m:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def bck(v, st, k, e, m, g):&lt;br /&gt;
    for i in range(2):&lt;br /&gt;
        st[k] = i&lt;br /&gt;
        if valid(v, st, k, e, m):&lt;br /&gt;
            if k == e + m:&lt;br /&gt;
                g[0] = 1&lt;br /&gt;
                afisare(v, st, e, m)&lt;br /&gt;
            else:&lt;br /&gt;
                bck(v, st, k + 1, e, m, g)&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, m):&lt;br /&gt;
    if 0 &amp;lt;= n &amp;lt;= 17 and 0 &amp;lt;= m &amp;lt;= 17 and 0 &amp;lt;= n + m &amp;lt;= 28:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    e, m = map(int, input().split())&lt;br /&gt;
    &lt;br /&gt;
    if not check_restrictions(e, m):&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    v = [&#039;&#039;] * 109&lt;br /&gt;
    st = [0] * 109&lt;br /&gt;
    g = [0]&lt;br /&gt;
    v[0], v[1] = &#039;E&#039;, &#039;M&#039;&lt;br /&gt;
    bck(v, st, 1, e, m, g)&lt;br /&gt;
    if g[0] == 0:&lt;br /&gt;
        print(&amp;quot;IMPOSIBIL&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3918_-_Back_Cp&amp;diff=9165</id>
		<title>3918 - Back Cp</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3918_-_Back_Cp&amp;diff=9165"/>
		<updated>2024-01-07T11:07:58Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Se citesc două numere naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;. Afișați în ordine lexicografică toate cuvintele care sunt formate din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; litere &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; litere &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; cu proprietatea că nu există nicio literă &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; cuprinsă între două litere &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;.  = Date de intrare = Programul citește de la tastatură numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, separate prin spații.  = Date de ieșire...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se citesc două numere naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;. Afișați în ordine lexicografică toate cuvintele care sunt formate din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; litere &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; litere &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; cu proprietatea că nu există nicio literă &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; cuprinsă între două litere &amp;lt;code&amp;gt;C&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; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran pe linii separate cuvintele cerute.Î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;0 ≤ n ≤ 13&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0 ≤ m ≤ 13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 3 2&lt;br /&gt;
Ieșire&lt;br /&gt;
 CCCPP&lt;br /&gt;
 CCPPC&lt;br /&gt;
 CPPCC&lt;br /&gt;
 PCCCP&lt;br /&gt;
 PPCCC&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 14 14&lt;br /&gt;
Ieșire&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 check_restrictions(n, m):&lt;br /&gt;
    if 0 &amp;lt;= n &amp;lt;= 13 and 0 &amp;lt;= m &amp;lt;= 13:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def afisare(X, n, m):&lt;br /&gt;
    result = &amp;quot;&amp;quot;&lt;br /&gt;
    for i in range(1, n + m + 1):&lt;br /&gt;
        if X[i] == 0:&lt;br /&gt;
            result += &#039;C&#039;&lt;br /&gt;
        else:&lt;br /&gt;
            result += &#039;P&#039;&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
def ok(X, k, n, m):&lt;br /&gt;
    s = sum(X[1:k+1])&lt;br /&gt;
    if s &amp;gt; m or k - s &amp;gt; n:&lt;br /&gt;
        return False&lt;br /&gt;
    if k &amp;gt; 2 and X[k-2] == 0 and X[k-1] == 1 and X[k] == 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def back(X, k, n, m):&lt;br /&gt;
    for i in range(2):&lt;br /&gt;
        X[k] = i&lt;br /&gt;
        if ok(X, k, n, m):&lt;br /&gt;
            if k == n + m:&lt;br /&gt;
                afisare(X, n, m)&lt;br /&gt;
            else:&lt;br /&gt;
                back(X, k + 1, n, m)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, m = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    if not check_restrictions(n, m):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    X = [0] * (n + m + 1)&lt;br /&gt;
    back(X, 1, n, m)&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3917_-_Numere_1234&amp;diff=9163</id>
		<title>3917 - Numere 1234</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3917_-_Numere_1234&amp;diff=9163"/>
		<updated>2024-01-07T11:05:04Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Se citește &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; număr natural nenul. Afișați în ordine crescătoare toate numerele care au o cifră egală cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, două cifre de &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cifre egale cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.  = Date de intrare = Programul citește de la tastatură numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.  = Date de ieșire = Programul va afișa pe ecran pe linii separte numerele cerute.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Da...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se citește &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; număr natural nenul. Afișați în ordine crescătoare toate numerele care au o cifră egală cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, două cifre de &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cifre egale cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.&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;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran pe linii separte numerele cerute.Î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 ≤ 4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 2&lt;br /&gt;
Ieșire&lt;br /&gt;
 122&lt;br /&gt;
 212&lt;br /&gt;
 221&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5&lt;br /&gt;
Ieșire&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 afisare(x, m):&lt;br /&gt;
    for i in range(1, m + 1):&lt;br /&gt;
        print(x[i], end=&amp;quot;&amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
def valid(x, k, n):&lt;br /&gt;
    vf = [0] * 5&lt;br /&gt;
    for i in range(1, k + 1):&lt;br /&gt;
        vf[x[i]] += 1&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if vf[i] &amp;gt; i:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def backtracking(x, k, n, m):&lt;br /&gt;
    if k &amp;gt; m:&lt;br /&gt;
        afisare(x, m)&lt;br /&gt;
    else:&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            x[k] = i&lt;br /&gt;
            if valid(x, k, n):&lt;br /&gt;
                backtracking(x, k + 1, n, m)&lt;br /&gt;
&lt;br /&gt;
def check_restriction(n):&lt;br /&gt;
    return 1 &amp;lt;= n &amp;lt;= 4&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    if not check_restriction(n):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    m = n * (n + 1) // 2&lt;br /&gt;
    x = [0] * 11&lt;br /&gt;
    backtracking(x, 1, n, m)&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3991_-_Modifica_Paranteze&amp;diff=9162</id>
		<title>3991 - Modifica Paranteze</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3991_-_Modifica_Paranteze&amp;diff=9162"/>
		<updated>2024-01-07T11:00:56Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Fie un șir de paranteze rotunde, deschise sau închise. Putem efectua de câte ori dorim operația de transformare a unei paranteze deschise într-una închisă sau invers. Să se determine numărul minim de operații necesare transformării secvenței inițiale într-una corect parantezată. Dacă acest lucru nu este posibil, se va afișa &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.  = Date de intrare = Programul citește de la tastatură șirul de paranteze rotunde, fără spații.  = Da...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Fie un șir de paranteze rotunde, deschise sau închise. Putem efectua de câte ori dorim operația de transformare a unei paranteze deschise într-una închisă sau invers. Să se determine numărul minim de operații necesare transformării secvenței inițiale într-una corect parantezată. Dacă acest lucru nu este posibil, 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 de la tastatură șirul de paranteze rotunde, fără spații.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul minim de operații necesar pentru a transforma șirul într-o secvență corect parantezată. Dacă nu este posibilă parantezarea corectă, se va afișa &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 ≤ numărul de paranteze ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 ((((&lt;br /&gt;
Ieșire&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
O posibilitate este să modificăm ultimele două paranteze deschise în paranteze închise și să obținem &amp;lt;code&amp;gt;(())&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((&lt;br /&gt;
Ieșire&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 check_restriction(s):&lt;br /&gt;
    num_parentheses = s.count(&#039;(&#039;) + s.count(&#039;)&#039;)&lt;br /&gt;
    return 1 &amp;lt;= num_parentheses &amp;lt;= 1000&lt;br /&gt;
&lt;br /&gt;
def nr_min_op(s):&lt;br /&gt;
    cnt = 0&lt;br /&gt;
    nr_op = 0&lt;br /&gt;
    n = len(s)&lt;br /&gt;
&lt;br /&gt;
    if not check_restriction(s):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
        return -1&lt;br /&gt;
&lt;br /&gt;
    if n % 2 == 1:&lt;br /&gt;
        return -1&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        if s[i] == &#039;(&#039;:&lt;br /&gt;
            cnt += 1&lt;br /&gt;
        else:&lt;br /&gt;
            cnt -= 1&lt;br /&gt;
&lt;br /&gt;
        if cnt &amp;lt; 0:&lt;br /&gt;
            nr_op += 1&lt;br /&gt;
            cnt = 1&lt;br /&gt;
&lt;br /&gt;
    nr_op += cnt // 2&lt;br /&gt;
    return nr_op&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    s = input(&amp;quot;Introduceti un sir cu paranteze: &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if check_restriction(s):&lt;br /&gt;
        result = nr_min_op(s)&lt;br /&gt;
        if result != -1:&lt;br /&gt;
            print(result)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0205_-_Shuffle&amp;diff=9155</id>
		<title>0205 - Shuffle</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0205_-_Shuffle&amp;diff=9155"/>
		<updated>2024-01-07T10:21:07Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = Se citeşte un număr natural nenul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi o permutare a mulţimii &amp;lt;code&amp;gt;M={1,2,..,n}&amp;lt;/code&amp;gt;. Să se afişeze, în ordine lexicografică, toate permutările mulţimii M care nu conţin elemente alăturate care au fost alăturate şi în permutarea dată.  = Date de intrare = Fişierul de intrare &amp;lt;code&amp;gt;shuffleIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; valori distincte cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se citeşte un număr natural nenul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi o permutare a mulţimii &amp;lt;code&amp;gt;M={1,2,..,n}&amp;lt;/code&amp;gt;. Să se afişeze, în ordine lexicografică, toate permutările mulţimii M care nu conţin elemente alăturate care au fost alăturate şi în permutarea dată.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;shuffleIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; valori 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;, separate prin câte un spațiu, reprezentând permutarea dată.&lt;br /&gt;
&lt;br /&gt;
= Date de ieşire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;shuffleOUT.txt&amp;lt;/code&amp;gt; va conţine pe fiecare linie elementele unei permutări, separate prin câte 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;0 &amp;lt; n &amp;lt; 9&amp;lt;/code&amp;gt;&lt;br /&gt;
* dacă nu există soluţii se va afişa pe prima linie a fişierului de ieşire mesajul &amp;lt;code&amp;gt;nu exista&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;shuffleIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 2 3 1 4&lt;br /&gt;
&amp;lt;code&amp;gt;shuffleOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 2 4 3 &lt;br /&gt;
 3 4 2 1 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;shuffleIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 11&lt;br /&gt;
 2 3 1 4&lt;br /&gt;
&amp;lt;code&amp;gt;shuffleOUT.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 citire():&lt;br /&gt;
    with open(&amp;quot;shuffleIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as input_file:&lt;br /&gt;
        n = int(input_file.readline().strip())&lt;br /&gt;
        v = [0] + list(map(int, input_file.readline().split()))&lt;br /&gt;
    return n, v&lt;br /&gt;
&lt;br /&gt;
def prim(num):&lt;br /&gt;
    if num &amp;lt; 2:&lt;br /&gt;
        return False&lt;br /&gt;
    if num % 2 == 0 and num != 2:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(3, int(num**0.5) + 1, 2):&lt;br /&gt;
        if num % i == 0:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def sortare(n, v):&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        for j in range(i + 1, n + 1):&lt;br /&gt;
            if not prim(v[i]) and not prim(v[j]) and v[i] &amp;gt; v[j]:&lt;br /&gt;
                v[i], v[j] = v[j], v[i]&lt;br /&gt;
&lt;br /&gt;
def puncte_fixe(n, v):&lt;br /&gt;
    x = [0] * (n + 1)&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if prim(v[i]):&lt;br /&gt;
            x[i] = i&lt;br /&gt;
    return x&lt;br /&gt;
&lt;br /&gt;
def afisare(n, v, x, output_file):&lt;br /&gt;
    result = [v[x[i]] for i in range(1, n + 1) if x[i] != 0]&lt;br /&gt;
    output_file.write(&amp;quot; &amp;quot;.join(map(str, result)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def valid(k, x):&lt;br /&gt;
    for i in range(1, k):&lt;br /&gt;
        if x[i] == x[k]:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def backtracking(k, n, v, x, output_file):&lt;br /&gt;
    if k &amp;gt; n:&lt;br /&gt;
        afisare(n, v, x, output_file)&lt;br /&gt;
    else:&lt;br /&gt;
        if prim(v[k]):&lt;br /&gt;
            backtracking(k + 1, n, v, x, output_file)&lt;br /&gt;
        else:&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                if not prim(v[i]):&lt;br /&gt;
                    x[k] = i&lt;br /&gt;
                    if valid(k, x):&lt;br /&gt;
                        backtracking(k + 1, n, v, x, output_file)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n):&lt;br /&gt;
    if 0 &amp;lt; n &amp;lt; 9:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        with open(&amp;quot;shuffleOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
            output_file.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, v = citire()&lt;br /&gt;
&lt;br /&gt;
    if verifica_restrictii(n):&lt;br /&gt;
        sortare(n, v)&lt;br /&gt;
        x = puncte_fixe(n, v)&lt;br /&gt;
&lt;br /&gt;
        with open(&amp;quot;shuffleOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
            backtracking(1, n, v, x, output_file)&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1327_-_SirPIE&amp;diff=9153</id>
		<title>1327 - SirPIE</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1327_-_SirPIE&amp;diff=9153"/>
		<updated>2024-01-07T10:04:37Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = Se citeşte un număr natural nenul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, apoi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale distincte. Să se afişeze, în ordine lexicografică, șirurile din cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; valori cu proprietatea că oricare două valori învecinate sunt prime între ele.  = Date de intrare = Fişierul de intrare &amp;lt;code&amp;gt;sirpieIN.txt&amp;lt;/code&amp;gt;conţine pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale.  = Date de ieşire = Fişierul de ieşi...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se citeşte un număr natural nenul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, apoi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale distincte. Să se afişeze, în ordine lexicografică, șirurile din cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; valori cu proprietatea că oricare două valori învecinate sunt prime între ele.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;sirpieIN.txt&amp;lt;/code&amp;gt;conţine pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a doua linie &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere naturale.&lt;br /&gt;
&lt;br /&gt;
= Date de ieşire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;sirpieOUT.txt&amp;lt;/code&amp;gt; va conţine pe fiecare linie elementele unei șir, separate prin câte un spaţiu.Î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 &amp;lt; 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; numere de pe a doua linie a fişierului de intrare sunt mai mici decât &amp;lt;code&amp;gt;10000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;sirpieIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 8 6 7 9&lt;br /&gt;
&amp;lt;code&amp;gt;sirpieOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 7 8 9 &lt;br /&gt;
 6 7 9 8 &lt;br /&gt;
 8 9 7 6 &lt;br /&gt;
 9 8 7 6 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;sirpieIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 11&lt;br /&gt;
 8 6 7 9&lt;br /&gt;
&amp;lt;code&amp;gt;sirpieOUT.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 check_constraints(n, v, fout):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt; 10):&lt;br /&gt;
        fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for num in v:&lt;br /&gt;
        if not (1 &amp;lt;= num &amp;lt; 10000):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    while b:&lt;br /&gt;
        a, b = b, a % b&lt;br /&gt;
    return a&lt;br /&gt;
&lt;br /&gt;
def afisare_sol(sol, fout):&lt;br /&gt;
    fout.write(&amp;quot; &amp;quot;.join(map(str, sol)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def back(k, prev, fout):&lt;br /&gt;
    if k == n:&lt;br /&gt;
        afisare_sol(sol, fout)&lt;br /&gt;
    else:&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            if not folosit[i] and gcd(v[i], prev) == 1:&lt;br /&gt;
                sol[k] = v[i]&lt;br /&gt;
                folosit[i] = True&lt;br /&gt;
                back(k + 1, v[i], fout)&lt;br /&gt;
                folosit[i] = False&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;sirpieIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;sirpieOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        v = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
        if not check_constraints(n, v, fout):&lt;br /&gt;
            # Exit if constraints are not met&lt;br /&gt;
            exit()&lt;br /&gt;
&lt;br /&gt;
        sol = [0] * n&lt;br /&gt;
        folosit = [False] * n&lt;br /&gt;
&lt;br /&gt;
        # Sorting&lt;br /&gt;
        v.sort()&lt;br /&gt;
&lt;br /&gt;
        back(0, 1, fout)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1666_%E2%80%93_Arbrush&amp;diff=9152</id>
		<title>1666 – Arbrush</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1666_%E2%80%93_Arbrush&amp;diff=9152"/>
		<updated>2024-01-07T09:32:08Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == Eșuând în a-și regăsi adevărata identitate, Brush se refugiază în magicul tărâm al arborilor. Arbotra o sună și îi dă următoarea problemă: se dă un arbore cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri, o rădăcină fixată, și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; întrebări de forma: câte perechi neordonate de noduri pot forma, luând noduri doar din subarborele nodului &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; (inclusiv pe &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;).  = Cerința = Ajutați-o pe Brush să răspundă cât mai repede la int...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Eșuând în a-și regăsi adevărata identitate, Brush se refugiază în magicul tărâm al arborilor. Arbotra o sună și îi dă următoarea problemă: se dă un arbore cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri, o rădăcină fixată, și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; întrebări de forma: câte perechi neordonate de noduri pot forma, luând noduri doar din subarborele nodului &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; (inclusiv pe &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Ajutați-o pe Brush să răspundă cât mai repede la intrebările lui Arbotra.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;arbrushIN.txt&amp;lt;/code&amp;gt; va conține pe prima linie trei numere naturale, numărul &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;Root&amp;lt;/code&amp;gt;, separate de un spațiu. Următoarele &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; linii vor conține două numere naturale &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;), separate de un spațiu, cu semnificația că există muchie între nodurile &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Ultima linie a fișierului de intrare (linia &amp;lt;code&amp;gt;N+1&amp;lt;/code&amp;gt;) va conține &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; numere separate de căte un spațiu, acestea vor semnifica cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; întrebari cerute de Arbotra.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;arbrushOUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii, aflându-se răspunsul la fiecare întrebare cerută (în ordinea cerută în fișierul de intrare).Î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;2 ≤ N, M ≤ 27040&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Root ≤ N&amp;lt;/code&amp;gt;&lt;br /&gt;
* Uituc de fel, Arbotra poate pune aceeași întrebare de mai multe ori.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;arbrushIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8 4 1&lt;br /&gt;
 1 2&lt;br /&gt;
 2 3&lt;br /&gt;
 2 5&lt;br /&gt;
 5 6&lt;br /&gt;
 6 7&lt;br /&gt;
 6 8&lt;br /&gt;
 1 4&lt;br /&gt;
 6 4 5 2&lt;br /&gt;
&amp;lt;code&amp;gt;arbrushOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 0&lt;br /&gt;
 6&lt;br /&gt;
 15&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Pentru prima întrebare, răspunsul este &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, deoarece în subarborele nodului &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; există &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; noduri: &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;, cu care pot forma perechile &amp;lt;code&amp;gt;{6, 7}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{7, 8}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{6, 8}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a doua întrebare răspunsul este &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, deoarece subarborele lui &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; are doar un nod, pe el înșusi și nu se pot forma perechi de câte două noduri.&lt;br /&gt;
&lt;br /&gt;
Pentru a treia întrebare răspunsul este 6, deoarece în subarborele nodului &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; există &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; noduri: &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;, perechile formate sunt &amp;lt;code&amp;gt;{6, 8}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{5, 6}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{7, 8}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{5, 8}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{5, 7}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{6, 7}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru a patra întrebare răspunsul este &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;arbrushIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 27041 4 1&lt;br /&gt;
 1 2&lt;br /&gt;
 2 3&lt;br /&gt;
 2 5&lt;br /&gt;
 5 6&lt;br /&gt;
 6 7&lt;br /&gt;
 6 8&lt;br /&gt;
 1 4&lt;br /&gt;
 6 4 5 2&lt;br /&gt;
&amp;lt;code&amp;gt;arbrushOUT.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;
Nmax = 27040 + 1&lt;br /&gt;
Mmax = 27040 + 1&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(N, M, Root):&lt;br /&gt;
    if not (2 &amp;lt;= N &amp;lt;= 27040) or not (2 &amp;lt;= M &amp;lt;= 27040) or not (1 &amp;lt;= Root &amp;lt;= N):&lt;br /&gt;
        with open(&amp;quot;arbrushOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
            file_out.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 DFS(x):&lt;br /&gt;
    global Viz, D, Tree&lt;br /&gt;
    Viz[x] = True&lt;br /&gt;
    D[x] = 1&lt;br /&gt;
    for y in Tree[x]:&lt;br /&gt;
        if not Viz[y]:&lt;br /&gt;
            DFS(y)&lt;br /&gt;
            D[x] += D[y]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global N, M, Root, D, Tree, Viz&lt;br /&gt;
    with open(&amp;quot;arbrushIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as file_in:&lt;br /&gt;
        N, M, Root = map(int, file_in.readline().split())&lt;br /&gt;
        if not check_restrictions(N, M, Root):&lt;br /&gt;
            return&lt;br /&gt;
        &lt;br /&gt;
        Tree = [[] for _ in range(Nmax)]&lt;br /&gt;
        D = [0] * Nmax&lt;br /&gt;
        Viz = [False] * Nmax&lt;br /&gt;
&lt;br /&gt;
        for _ in range(N - 1):&lt;br /&gt;
            a, b = map(int, file_in.readline().split())&lt;br /&gt;
            Tree[a].append(b)&lt;br /&gt;
            Tree[b].append(a)&lt;br /&gt;
&lt;br /&gt;
        DFS(Root)&lt;br /&gt;
&lt;br /&gt;
        questions = list(map(int, file_in.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;arbrushOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
        for x in questions:&lt;br /&gt;
            file_out.write(str((D[x] * (D[x] - 1)) // 2) + &#039;\n&#039;)&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3944_-_Turn_1&amp;diff=9151</id>
		<title>3944 - Turn 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3944_-_Turn_1&amp;diff=9151"/>
		<updated>2024-01-07T09:19:35Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == Se consideră &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuburi numerotate 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; pentru care se cunosc latura și culoarea. Să se genereze toate turnurile de înălțime &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; ce se pot forma cu cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuburi, astfel încât fiecare turn să respecte următoarele condiții:  * orice cub se așează peste un altul ce are latura mai mare sau egală cu a lui; * să nu existe două cuburi consecutive de aceeași culoare;  = Date de intrare...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Se consideră &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuburi numerotate 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; pentru care se cunosc latura și culoarea. Să se genereze toate turnurile de înălțime &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; ce se pot forma cu cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuburi, astfel încât fiecare turn să respecte următoarele condiții:&lt;br /&gt;
&lt;br /&gt;
* orice cub se așează peste un altul ce are latura mai mare sau egală cu a lui;&lt;br /&gt;
* să nu existe două cuburi consecutive de aceeași culoare;&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;turn_1IN.txt&amp;lt;/code&amp;gt; conține pe prima linie două numere naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii descrierea cuburilor. Linia &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt; conține descrierea cubului &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; sub forma: &#039;&#039;latură culoare&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;turn_1OUT.txt&amp;lt;/code&amp;gt; va conține soluțiile generate în ordinea lexicografică a indicilor. O soluție este validă dacă conține descrierea indicilor cuburilor care alcătuiesc turnul de înălțime &amp;lt;code&amp;gt;H&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 &amp;lt; 15&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ H ≤ 50&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ latura ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;culorile sunt șiruri de caractere cu cel mult 20 de litere și sunt scrise cu litere mici&amp;lt;/code&amp;gt;&lt;br /&gt;
* nu există cuburi identice&lt;br /&gt;
* pentru datele de intrare există întotdeauna soluție&lt;br /&gt;
&lt;br /&gt;
= Exemplu 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;turn_1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 5&lt;br /&gt;
 1 alb&lt;br /&gt;
 2 alb&lt;br /&gt;
 1 roz&lt;br /&gt;
 2 roz&lt;br /&gt;
 3 alb&lt;br /&gt;
&amp;lt;code&amp;gt;turn_1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 4 1 &lt;br /&gt;
 4 2 3 &lt;br /&gt;
 5 3 1 &lt;br /&gt;
 5 4 &lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Primul turn este format din cuburile: &amp;lt;code&amp;gt;2 (2,alb), 4 (2,roz), 1 (1,alb)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Al doilea turn este format din cuburile: &amp;lt;code&amp;gt;4 (2,roz), 2 (2,alb), 3 (1,roz)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
etc.&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;turn_1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 16 5&lt;br /&gt;
 1 alb&lt;br /&gt;
 2 alb&lt;br /&gt;
 1 roz&lt;br /&gt;
 2 roz&lt;br /&gt;
 3 alb&lt;br /&gt;
&amp;lt;code&amp;gt;turn_1OUT.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 afisare(b):&lt;br /&gt;
    non_zero_values = [value for value in b if value != 0]&lt;br /&gt;
    fout.write(&amp;quot; &amp;quot;.join(map(str, non_zero_values)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def verif(k):&lt;br /&gt;
    if k &amp;gt; 1:&lt;br /&gt;
        if col[b[k]] == col[b[k-1]]:&lt;br /&gt;
            return False&lt;br /&gt;
        if lat[b[k]] &amp;gt; lat[b[k-1]]:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, h, lat, col):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt; 15 and 1 &amp;lt;= h &amp;lt;= 50):&lt;br /&gt;
        fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if not (1 &amp;lt;= lat[i] &amp;lt;= 10 and 1 &amp;lt;= len(col[i]) &amp;lt;= 20 and col[i].islower()):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def bkt(k, sp):&lt;br /&gt;
    for i in range(1, n+1):&lt;br /&gt;
        if viz[i] == 0:&lt;br /&gt;
            b[k] = i&lt;br /&gt;
            viz[i] = 1&lt;br /&gt;
            sp += lat[b[k]]&lt;br /&gt;
            if sp &amp;lt;= h and verif(k):&lt;br /&gt;
                if sp == h:&lt;br /&gt;
                    afisare(b[:k+1])&lt;br /&gt;
                else:&lt;br /&gt;
                    bkt(k+1, sp)&lt;br /&gt;
            sp -= lat[b[k]]&lt;br /&gt;
            viz[i] = 0&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;turn_1IN.txt&amp;quot;, &#039;r&#039;) as fin, open(&amp;quot;turn_1OUT.txt&amp;quot;, &#039;w&#039;) as fout:&lt;br /&gt;
        n, h = map(int, fin.readline().split())&lt;br /&gt;
        lat = [0] * 105&lt;br /&gt;
        b = [0] * 105&lt;br /&gt;
        sp = 0&lt;br /&gt;
        viz = [0] * 105&lt;br /&gt;
        col = [&amp;quot;&amp;quot;] * 105&lt;br /&gt;
&lt;br /&gt;
        for i in range(1, n+1):&lt;br /&gt;
            line = fin.readline().split()&lt;br /&gt;
            if len(line) &amp;lt; 2:&lt;br /&gt;
                fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                exit()&lt;br /&gt;
&lt;br /&gt;
            lat_str, col[i] = line&lt;br /&gt;
            lat[i] = int(lat_str)&lt;br /&gt;
&lt;br /&gt;
        if not verifica_restrictii(n, h, lat, col):&lt;br /&gt;
            exit()&lt;br /&gt;
&lt;br /&gt;
        bkt(1, sp)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2109_-_Dineu&amp;diff=9150</id>
		<title>2109 - Dineu</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2109_-_Dineu&amp;diff=9150"/>
		<updated>2024-01-07T09:06:18Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == La un dineu participă reprezentanţii mai multor state. Fiecare reprezentant cunoaşte un număr de limbi străine. Doi reprezentanţi vor putea discuta direct dacă există cel puţin o limbă pe care o înţeleg amândoi. Organizatorii dineului doresc să existe cel puţin o masă la care să nu fie nevoie de translator, astfel oricare două persoane care stau la această masă să se înţeleagă direct.  = Cerința = Cunoscând &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; – numărul de...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
La un dineu participă reprezentanţii mai multor state. Fiecare reprezentant cunoaşte un număr de limbi străine. Doi reprezentanţi vor putea discuta direct dacă există cel puţin o limbă pe care o înţeleg amândoi. Organizatorii dineului doresc să existe cel puţin o masă la care să nu fie nevoie de translator, astfel oricare două persoane care stau la această masă să se înţeleagă direct.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Cunoscând &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; – numărul de reprezentanţi, identificăm fiecare reprezentant cu un număr natural cuprins între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; – numărul limbilor străine care se vorbesc la dineu (acestea sunt codificate prin numerele naturale de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;), numărul de limbi vorbite de fiecare reprezentant şi codurile acestora să se determine numărul maxim de persoane care pot sta la o masa fără translator.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;dineuIN.txt&amp;lt;/code&amp;gt; conţine, pe prima linie, numerele naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;, separate printr-un spaţiu, cu semnificaţia de mai sus. Pe fiecare dintre următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se află informaţii despre câte un reprezentant, în ordinea numerelor de identificare a acestora. Astfel, pe linia corespunzătoare reprezentantului &amp;lt;code&amp;gt;i (1≤i≤N)&amp;lt;/code&amp;gt;, se află un număr natural &amp;lt;code&amp;gt;nri&amp;lt;/code&amp;gt;- numărul limbilor străine vorbite de acesta, urmat de &amp;lt;code&amp;gt;nri&amp;lt;/code&amp;gt; numere naturale distincte &amp;lt;code&amp;gt;l1 l2 ... lnri&amp;lt;/code&amp;gt;, reprezentând codurile acestora. Numerele de pe aceeaşi linie sunt separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;dineuOUT.txt&amp;lt;/code&amp;gt; va conţine două linii. Pe prima linie se află numărul maxim de reprezentanţi care stau la aceeaşi masă. Pe a doua linie se află numerele de identificare ale acestora. Numerele de pe aceeaşi linie sunt separate prin câte un spaţiu.Î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;
• &amp;lt;code&amp;gt;1 &amp;lt;= N &amp;lt;= 20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
• &amp;lt;code&amp;gt;1 &amp;lt;= L &amp;lt;= 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
• &amp;lt;code&amp;gt;1 &amp;lt;= nri, l1, l2, ..., lnri &amp;lt;= 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
• Dacă există mai multe soluţii se va afişa cea mai mică din punct de vedere lexicografic&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;dineuIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 5&lt;br /&gt;
 3 1 3 5 &lt;br /&gt;
 2 3 4&lt;br /&gt;
 3 1 2 4&lt;br /&gt;
 2 4 5&lt;br /&gt;
 2 2 3&lt;br /&gt;
&amp;lt;code&amp;gt;dineuOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 1 2 3 4&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
1 cu 2 vorbesc în limba 3&lt;br /&gt;
&lt;br /&gt;
1 cu 4 vorbesc în limba 5&lt;br /&gt;
&lt;br /&gt;
1 cu 3 vorbesc în limba 1&lt;br /&gt;
&lt;br /&gt;
2 cu 4 vorbesc în limba 4&lt;br /&gt;
&lt;br /&gt;
2 cu 3 vorbesc în limba 4&lt;br /&gt;
&lt;br /&gt;
3 cu 4 vorbesc în limba 4&lt;br /&gt;
&lt;br /&gt;
există şi alte soluţii, de exemplu soluţia 1 2 3 5, dar este mai mare din punct de vedere lexicografic&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: ==&lt;br /&gt;
&amp;lt;code&amp;gt;dineuIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 21 5&lt;br /&gt;
 3 1 3 5 &lt;br /&gt;
 2 3 4&lt;br /&gt;
 3 1 2 4&lt;br /&gt;
 2 4 5&lt;br /&gt;
 2 2 3&lt;br /&gt;
&amp;lt;code&amp;gt;dineuOUT.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, l, limbi):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 20) or not (1 &amp;lt;= l &amp;lt;= 10):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        k = sum(limbi[i])&lt;br /&gt;
        if not (1 &amp;lt;= k &amp;lt;= 10):&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    nMAX = 20&lt;br /&gt;
    lMAX = 10&lt;br /&gt;
&lt;br /&gt;
    # Deschide fișierele pentru citire și scriere&lt;br /&gt;
    with open(&amp;quot;dineuIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;dineuOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        try:&lt;br /&gt;
            n, l = map(int, fin.readline().split())&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        limbi = [[0] * (lMAX + 1) for _ in range(nMAX + 1)]&lt;br /&gt;
&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            try:&lt;br /&gt;
                data = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
                # Verifică dacă linia citită conține suficiente elemente&lt;br /&gt;
                if len(data) &amp;lt; 2:&lt;br /&gt;
                    fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
                    return&lt;br /&gt;
&lt;br /&gt;
                k = data[0]&lt;br /&gt;
                for j in range(1, k + 1):&lt;br /&gt;
                    if j &amp;lt; len(data):&lt;br /&gt;
                        limbi[i][data[j]] = 1&lt;br /&gt;
                    else:&lt;br /&gt;
                        fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
                        return&lt;br /&gt;
            except ValueError:&lt;br /&gt;
                fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
&lt;br /&gt;
        # Verifică restricțiile&lt;br /&gt;
        if not verificare_restrictii(n, l, limbi):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        dp = [0] * (1 &amp;lt;&amp;lt; nMAX)&lt;br /&gt;
        solmax = []&lt;br /&gt;
&lt;br /&gt;
        dp[0] = 1&lt;br /&gt;
        for mask in range(1, (1 &amp;lt;&amp;lt; n)):&lt;br /&gt;
            i = 0&lt;br /&gt;
            while not (mask &amp;amp; 1 &amp;lt;&amp;lt; i):&lt;br /&gt;
                i += 1&lt;br /&gt;
&lt;br /&gt;
            oldmask = mask ^ 1 &amp;lt;&amp;lt; i&lt;br /&gt;
            if dp[oldmask]:&lt;br /&gt;
                okkk = True&lt;br /&gt;
                for j in range(n):&lt;br /&gt;
                    if oldmask &amp;amp; 1 &amp;lt;&amp;lt; j:&lt;br /&gt;
                        ok = False&lt;br /&gt;
                        for k in range(1, l + 1):&lt;br /&gt;
                            if limbi[j + 1][k] and limbi[i + 1][k]:&lt;br /&gt;
                                ok = True&lt;br /&gt;
                                break&lt;br /&gt;
&lt;br /&gt;
                        if not ok:&lt;br /&gt;
                            okkk = False&lt;br /&gt;
                            break&lt;br /&gt;
&lt;br /&gt;
                dp[mask] = okkk&lt;br /&gt;
&lt;br /&gt;
            if dp[mask]:&lt;br /&gt;
                sz = bin(mask).count(&#039;1&#039;)&lt;br /&gt;
&lt;br /&gt;
                if sz == len(solmax):&lt;br /&gt;
                    ok = False&lt;br /&gt;
                    k = 0&lt;br /&gt;
                    for j in range(n):&lt;br /&gt;
                        if mask &amp;amp; 1 &amp;lt;&amp;lt; j:&lt;br /&gt;
                            if ok:&lt;br /&gt;
                                solmax[k] = j + 1&lt;br /&gt;
                            else:&lt;br /&gt;
                                if j + 1 &amp;lt; solmax[k]:&lt;br /&gt;
                                    solmax[k] = j + 1&lt;br /&gt;
                                    ok = True&lt;br /&gt;
                                elif j + 1 &amp;gt; solmax[k]:&lt;br /&gt;
                                    break&lt;br /&gt;
                            k += 1&lt;br /&gt;
&lt;br /&gt;
                elif sz &amp;gt; len(solmax):&lt;br /&gt;
                    solmax = [j + 1 for j in range(n) if mask &amp;amp; 1 &amp;lt;&amp;lt; j]&lt;br /&gt;
&lt;br /&gt;
        # Scrie rezultatele în fișierul de ieșire&lt;br /&gt;
        fout.write(f&amp;quot;{len(solmax)}\n&amp;quot;)&lt;br /&gt;
        fout.write(&amp;quot; &amp;quot;.join(map(str, solmax)))&lt;br /&gt;
&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1979_-_Rb_Tree&amp;diff=9149</id>
		<title>1979 - Rb Tree</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1979_-_Rb_Tree&amp;diff=9149"/>
		<updated>2024-01-07T08:45:53Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == Gigel se joacă cu un graf orientat cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri. Inițial toate nodurile grafului sunt transparente, dar lui Gigel îi place schimbarea. Fire ambițioasă, el colorează unele noduri în roșu, altele în negru, iar pe celelalte în alb (probabil din cauza crizei de vopsea colorată din 2017).  Gigel recrutează o armată de furnici pe care o așează în nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, cu el în fruntea lor și se hotărăște să cucerească graful.În fieca...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Gigel se joacă cu un graf orientat cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri. Inițial toate nodurile grafului sunt transparente, dar lui Gigel îi place schimbarea. Fire ambițioasă, el colorează unele noduri în roșu, altele în negru, iar pe celelalte în alb (probabil din cauza crizei de vopsea colorată din 2017).&lt;br /&gt;
&lt;br /&gt;
Gigel recrutează o armată de furnici pe care o așează în nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, cu el în fruntea lor și se hotărăște să cucerească graful.În fiecare moment, Gigel poate trimite un număr de furnici din orice nod &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; (în care se află deja furnici) în vecinii lui &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, cu condiția ca cel puțin o furnică să rămână în nodul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;. Excepție de la această regulă face nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, cel în care se află Gigel, unde nu este obligatoriu să rămână furnici.&lt;br /&gt;
&lt;br /&gt;
Dacă într-un nod se află Gigel sau cel puțin o furnică, atunci acel nod se numește ocupat. Graful este cucerit atunci când Gigel a ocupat cel puțin un nod roșu și cel puțin un nod negru.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Sa se determine numărul minim de furnici pentru ca Gigel să cucerească graful.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;rbtreeIN.txt&amp;lt;/code&amp;gt; conține pe prima linie trei numere naturale: &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; – reprezentând numărul de noduri ale grafului, &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; – reprezentând numărul nodurilor de culoare roșie și &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; – reprezentând numărul nodurilor de culoare neagră.&lt;br /&gt;
&lt;br /&gt;
A doua linie conține &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; numere distincte &amp;lt;code&amp;gt;r1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;rR&amp;lt;/code&amp;gt;, reprezentând nodurile roșii.&lt;br /&gt;
&lt;br /&gt;
A treia linie conține &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; numere distincte &amp;lt;code&amp;gt;b1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;bB&amp;lt;/code&amp;gt;, reprezentând nodurile negre.&lt;br /&gt;
&lt;br /&gt;
Următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii descriu nodurile grafului împreună cu vecinii lor. Pe linia &amp;lt;code&amp;gt;i+3&amp;lt;/code&amp;gt; se află vecinii nodului &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și este formată din:&lt;br /&gt;
&lt;br /&gt;
- un număr &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;, reprezentând numărul de vecini ai nodului &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; numere distincte &amp;lt;code&amp;gt;n1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;n2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;…&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;nP&amp;lt;/code&amp;gt; reprezentând vecinii nodului&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;rbtreeOUT.txt&amp;lt;/code&amp;gt; va conține o singură linie pe care se află numărul minim de furnici pentru ca Gigel să cucerească graful. În cazul în care graful nu poate fi cucerit, se va afișa mesajul &amp;lt;code&amp;gt;impossible&amp;lt;/code&amp;gt;.Î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;2 ≤ N ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ R &amp;lt; N&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ B &amp;lt; N&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ ri ≤ N&amp;lt;/code&amp;gt;, pentru oricare &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ i ≤ R&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ bi ≤ N&amp;lt;/code&amp;gt;, pentru oricare &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ i ≤ B&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ P ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ ni ≤ N&amp;lt;/code&amp;gt;, pentru oricare &amp;lt;code&amp;gt;1 ≤ i ≤ P&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se garantează că un nod are o singură culoare. Dacă un nod nu este roșu sau negru, atunci este alb.&lt;br /&gt;
* Gigel rămâne tot timpul în nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, deci nodul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; este ocupat.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;rbtreeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 1 1&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
 1 2&lt;br /&gt;
 2 3 1&lt;br /&gt;
 1 1&lt;br /&gt;
&amp;lt;code&amp;gt;rbtreeOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;rbtreeIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100001 1 1&lt;br /&gt;
 2&lt;br /&gt;
 3&lt;br /&gt;
 1 2&lt;br /&gt;
 2 3 1&lt;br /&gt;
 1 1&lt;br /&gt;
&amp;lt;code&amp;gt;rbtreeOUT.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 deque&lt;br /&gt;
&lt;br /&gt;
INF = 99999999&lt;br /&gt;
NR = 100005&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, RED, BLACK, red_nodes, black_nodes, p_values):&lt;br /&gt;
    if not (2 &amp;lt;= n &amp;lt;= 100000 and 1 &amp;lt;= RED &amp;lt; n and 1 &amp;lt;= BLACK &amp;lt; n):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    for x in red_nodes + black_nodes:&lt;br /&gt;
        if not (1 &amp;lt;= x &amp;lt;= n):&lt;br /&gt;
            return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    for ni in p_values:&lt;br /&gt;
        if not (1 &amp;lt;= ni &amp;lt;= n):&lt;br /&gt;
            return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return None  # All restrictions are satisfied&lt;br /&gt;
&lt;br /&gt;
def BFS(q, dist, graph):&lt;br /&gt;
    while q:&lt;br /&gt;
        k = q.popleft()&lt;br /&gt;
        for x in graph[k]:&lt;br /&gt;
            if dist[x] &amp;gt; dist[k] + 1:&lt;br /&gt;
                dist[x] = dist[k] + 1&lt;br /&gt;
                q.append(x)&lt;br /&gt;
&lt;br /&gt;
def process_input(filename):&lt;br /&gt;
    try:&lt;br /&gt;
        with open(filename, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
            n, RED, BLACK = map(int, f.readline().split())&lt;br /&gt;
&lt;br /&gt;
            restriction_result = check_restrictions(n, RED, BLACK, [], [], [])&lt;br /&gt;
            if restriction_result:&lt;br /&gt;
                return restriction_result&lt;br /&gt;
&lt;br /&gt;
            redQueue = deque()&lt;br /&gt;
            blackQueue = deque()&lt;br /&gt;
            rootQueue = deque()&lt;br /&gt;
            v = [[] for _ in range(NR)]&lt;br /&gt;
            vt = [[] for _ in range(NR)]&lt;br /&gt;
&lt;br /&gt;
            redDist = [INF] * NR&lt;br /&gt;
            blackDist = [INF] * NR&lt;br /&gt;
            rootDist = [INF] * NR&lt;br /&gt;
&lt;br /&gt;
            line = list(map(int, f.readline().split()))&lt;br /&gt;
            for i in range(RED):&lt;br /&gt;
                x = line[i]&lt;br /&gt;
                redDist[x] = 0&lt;br /&gt;
                redQueue.append(x)&lt;br /&gt;
&lt;br /&gt;
            line = list(map(int, f.readline().split()))&lt;br /&gt;
            for i in range(BLACK):&lt;br /&gt;
                x = line[i]&lt;br /&gt;
                blackDist[x] = 0&lt;br /&gt;
                blackQueue.append(x)&lt;br /&gt;
&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                line = list(map(int, f.readline().split()[1:]))&lt;br /&gt;
                for x in line:&lt;br /&gt;
                    v[i].append(x)&lt;br /&gt;
                    vt[x].append(i)&lt;br /&gt;
&lt;br /&gt;
            rootDist[1] = 0&lt;br /&gt;
            rootQueue.append(1)&lt;br /&gt;
&lt;br /&gt;
            BFS(redQueue, redDist, vt)&lt;br /&gt;
            BFS(blackQueue, blackDist, vt)&lt;br /&gt;
            BFS(rootQueue, rootDist, v)&lt;br /&gt;
&lt;br /&gt;
            minn = INF&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                minn = min(minn, redDist[i] + blackDist[i] + rootDist[i])&lt;br /&gt;
&lt;br /&gt;
            if minn == INF:&lt;br /&gt;
                return &amp;quot;impossible\n&amp;quot;&lt;br /&gt;
            else:&lt;br /&gt;
                return str(minn) + &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        return str(e)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    input_filename = &amp;quot;rbtreeIN.txt&amp;quot;&lt;br /&gt;
    output_filename = &amp;quot;rbtreeOUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    result = process_input(input_filename)&lt;br /&gt;
&lt;br /&gt;
    with open(output_filename, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        g.write(result)&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1497_-_Nunta&amp;diff=9148</id>
		<title>1497 - Nunta</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1497_-_Nunta&amp;diff=9148"/>
		<updated>2024-01-07T08:31:31Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == La o nuntă sunt invitate &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; persoane, numerotate 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;. Se știe că o parte din ele se cunosc două câte două, fie că sunt rude, fie de la serviciu, fie sunt prieteni sau vecini. Astfel se vor forma un număr &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; minim de grupuri astfel încât în fiecare grup, fiecare persoană să aibă cel puţin un cunoscut. Pentru fiecare grup de cel puțin două persoane se stabileşte un lider – persoana cu nu...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
La o nuntă sunt invitate &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; persoane, numerotate 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;. Se știe că o parte din ele se cunosc două câte două, fie că sunt rude, fie de la serviciu, fie sunt prieteni sau vecini. Astfel se vor forma un număr &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; minim de grupuri astfel încât în fiecare grup, fiecare persoană să aibă cel puţin un cunoscut. Pentru fiecare grup de cel puțin două persoane se stabileşte un lider – persoana cu numărul de ordine minim. Aceste grupuri vor fi numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; în ordinea crescătoare a numerelor de ordine ale liderilor. Ca sa se ivească cât mai puține situații stânjenitoare, organizatorul nunții ar dori să aranjeze o masă principală cu cel puţin &amp;lt;code&amp;gt;n/2+1&amp;lt;/code&amp;gt; invitaţi, la care să fie aşezate unul sau mai multe astfel de grupuri întregi numerotate cu valori consecutive.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Fiind date &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, numărul de persoane, &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, numărul de perechi de invitaţi care se cunosc între ei și cele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; perechi, să se determine numărul &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; minim de grupuri formate din cel puțin doi invitați astfel încât, în fiecare grup, fiecare persoană să aibă cel puţin un cunoscut, precum şi numărul variantelor distincte în care se poate organiza masa cu cel puţin &amp;lt;code&amp;gt;n/2+1&amp;lt;/code&amp;gt; invitaţi din grupurile formate.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;nuntaIN.txt&amp;lt;/code&amp;gt; conține pe prima linie două numere naturale separate prin spațiu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; reprezentând numărul de invitaţi, respectiv &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; numărul de perechi de invitaţi care se cunosc între ei. Pe fiecare din următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii se află câte două numere naturale &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1≤x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;y≤n&amp;lt;/code&amp;gt;, separate printr-un spațiu, cu semnificația că invitaţii &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; se cunosc între ei.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;nuntaOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie un număr natural &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; reprezentând numărul minim de grupuri formate din cel puțin doi invitați astfel încât, în fiecare grup, fiecare persoană să aibă cel puţin un cunoscut. Pe cea de a doua linie va fi scris un număr natural &amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt; reprezentând numărul variantelor distincte în care se poate organiza masa cu cel puţin &amp;lt;code&amp;gt;n/2+1&amp;lt;/code&amp;gt; invitaţi din grupurile formate.Î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;0 &amp;lt; n &amp;lt;= 20000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; m &amp;lt;= 100000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;nuntaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 31 6&lt;br /&gt;
 5 7&lt;br /&gt;
 2 3&lt;br /&gt;
 10 14&lt;br /&gt;
 14 6&lt;br /&gt;
 9 15&lt;br /&gt;
 7 30&lt;br /&gt;
&amp;lt;code&amp;gt;nuntaOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 0&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Grupurile formate din cel puțin doi invitați sunt : &amp;lt;code&amp;gt;(2,3)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(5,7,30)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(6,10,14)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(9,15)&amp;lt;/code&amp;gt;, deci &amp;lt;code&amp;gt;K=4&amp;lt;/code&amp;gt;. Ele nu sunt suficiente pentru a forma o masă cu cel puţin &amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; invitaţi, deci sunt &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; variante de aranjare.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: ==&lt;br /&gt;
&amp;lt;code&amp;gt;nuntaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 20001 6&lt;br /&gt;
 5 7&lt;br /&gt;
 2 3&lt;br /&gt;
 10 14&lt;br /&gt;
 14 6&lt;br /&gt;
 9 15&lt;br /&gt;
 7 30&lt;br /&gt;
&amp;lt;code&amp;gt;nuntaOUT.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 namedtuple&lt;br /&gt;
&lt;br /&gt;
nMAX = 20000&lt;br /&gt;
&lt;br /&gt;
class Component:&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self.min = float(&#039;inf&#039;)&lt;br /&gt;
        self.cnt = 0&lt;br /&gt;
&lt;br /&gt;
components = [Component() for _ in range(nMAX + 1)]&lt;br /&gt;
gf = [[] for _ in range(nMAX + 1)]&lt;br /&gt;
viz = [0] * (nMAX + 1)&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, m):&lt;br /&gt;
    if not (0 &amp;lt; n &amp;lt;= 20000) or not (0 &amp;lt; m &amp;lt;= 100000):&lt;br /&gt;
        with open(&amp;quot;nuntaOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.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, fil):&lt;br /&gt;
    viz[nod] = fil&lt;br /&gt;
    for nex in gf[nod]:&lt;br /&gt;
        if not viz[nex]:&lt;br /&gt;
            dfs(nex, fil)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global nMAX&lt;br /&gt;
    global gf&lt;br /&gt;
    global viz&lt;br /&gt;
    global components&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;nuntaIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
&lt;br /&gt;
        if not check_constraints(n, m):&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        with open(&amp;quot;nuntaOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            for _ in range(m):&lt;br /&gt;
                a, b = map(int, fin.readline().split())&lt;br /&gt;
                gf[a].append(b)&lt;br /&gt;
                gf[b].append(a)&lt;br /&gt;
&lt;br /&gt;
            fil = 0&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                if not viz[i]:&lt;br /&gt;
                    fil += 1&lt;br /&gt;
                    dfs(i, fil)&lt;br /&gt;
&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                components[i].min = float(&#039;inf&#039;)&lt;br /&gt;
&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                components[viz[i]].min = min(components[viz[i]].min, i)&lt;br /&gt;
                components[viz[i]].cnt += 1&lt;br /&gt;
&lt;br /&gt;
            components = sorted(components[1:fil + 1], key=lambda x: (x.cnt == 1, x.min))&lt;br /&gt;
&lt;br /&gt;
            while components[fil - 1].cnt == 1:&lt;br /&gt;
                fil -= 1&lt;br /&gt;
&lt;br /&gt;
            fout.write(str(fil) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
            dr = 0&lt;br /&gt;
            s = 0&lt;br /&gt;
            ne = 0&lt;br /&gt;
            for st in range(1, fil + 1):&lt;br /&gt;
                while dr + 1 &amp;lt;= fil and s + components[dr].cnt &amp;lt; n // 2 + 1:&lt;br /&gt;
                    s += components[dr].cnt&lt;br /&gt;
                    dr += 1&lt;br /&gt;
&lt;br /&gt;
                if s + components[dr].cnt &amp;lt; n // 2 + 1:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                ne += fil - dr&lt;br /&gt;
                s -= components[st - 1].cnt&lt;br /&gt;
&lt;br /&gt;
            fout.write(str(ne))&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2261_-_Turn&amp;diff=9147</id>
		<title>2261 - Turn</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2261_-_Turn&amp;diff=9147"/>
		<updated>2024-01-06T22:12:06Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == Se consideră &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuburi numerotate 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; pentru care se cunosc latura și culoarea. Să se genereze toate turnurile de înălțime &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; ce se pot forma cu cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuburi, astfel încât fiecare turn să respecte următoarele condiții:  * orice cub se așează peste un altul ce are latura mai mare sau egală cu a lui; * să nu existe două cuburi consecutive de aceeași culoare;  = Date de intrare...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Se consideră &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuburi numerotate 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; pentru care se cunosc latura și culoarea. Să se genereze toate turnurile de înălțime &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; ce se pot forma cu cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuburi, astfel încât fiecare turn să respecte următoarele condiții:&lt;br /&gt;
&lt;br /&gt;
* orice cub se așează peste un altul ce are latura mai mare sau egală cu a lui;&lt;br /&gt;
* să nu existe două cuburi consecutive de aceeași culoare;&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;turnIN.txt&amp;lt;/code&amp;gt; conține pe prima linie două numere naturale &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii descrierea cuburilor. Linia &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt; conține descrierea cubului &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; sub forma: &#039;&#039;latură culoare&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;turnOUT.txt&amp;lt;/code&amp;gt; va conține soluțiile generate în ordinea lexicografică a indicilor. O soluție este validă dacă conține descrierea indicilor cuburilor care alcătuiesc turnul de înălțime &amp;lt;code&amp;gt;H&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 &amp;lt; 15&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ H ≤ 50&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ latura ≤ 10&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ culoare ≤ 5&amp;lt;/code&amp;gt;&lt;br /&gt;
* nu există cuburi identice&lt;br /&gt;
* pentru datele de intrare există întotdeauna soluție&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;turnIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 5&lt;br /&gt;
 1 1&lt;br /&gt;
 2 1&lt;br /&gt;
 1 2&lt;br /&gt;
 2 2&lt;br /&gt;
 3 1&lt;br /&gt;
&amp;lt;code&amp;gt;turnOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 4 1 &lt;br /&gt;
 4 2 3 &lt;br /&gt;
 5 3 1 &lt;br /&gt;
 5 4 &lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Primul turn este format din cuburile: &amp;lt;code&amp;gt;2 (2,1), 4 (2,2), 1 (1,1)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Al doilea turn este format din cuburile: &amp;lt;code&amp;gt;4 (2,2), 2 (2,1), 3 (1,2)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
etc.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1: ==&lt;br /&gt;
&amp;lt;code&amp;gt;turnIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 16 5&lt;br /&gt;
 1 1&lt;br /&gt;
 2 1&lt;br /&gt;
 1 2&lt;br /&gt;
 2 2&lt;br /&gt;
 3 1&lt;br /&gt;
&amp;lt;code&amp;gt;turnOUT.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 afis(k, st, out):&lt;br /&gt;
    out.write(&amp;quot; &amp;quot;.join(map(str, st[1:k + 1])) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def vef(k, st, v):&lt;br /&gt;
    if v[st[k]][&#039;y&#039;] == v[st[k - 1]][&#039;y&#039;]:&lt;br /&gt;
        return False&lt;br /&gt;
    if v[st[k]][&#039;x&#039;] &amp;gt; v[st[k - 1]][&#039;x&#039;]:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def back(k, suma, st, uz, v, h, out):&lt;br /&gt;
    for i in range(1, len(v) + 1):&lt;br /&gt;
        if not uz[i]:&lt;br /&gt;
            uz[i] = 1&lt;br /&gt;
            st[k] = i&lt;br /&gt;
            suma += v[st[k]][&#039;x&#039;]&lt;br /&gt;
            if k == 1 or (vef(k, st, v) and suma &amp;lt;= h):&lt;br /&gt;
                if suma == h:&lt;br /&gt;
                    afis(k, st, out)&lt;br /&gt;
                else:&lt;br /&gt;
                    back(k + 1, suma, st, uz, v, h, out)&lt;br /&gt;
            uz[i] = 0&lt;br /&gt;
            suma -= v[st[k]][&#039;x&#039;]&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, h, v):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt; 15 and 1 &amp;lt;= h &amp;lt;= 50):&lt;br /&gt;
        return False&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if not (1 &amp;lt;= v[i][&#039;x&#039;] &amp;lt;= 10 and 1 &amp;lt;= v[i][&#039;y&#039;] &amp;lt;= 5):&lt;br /&gt;
            return False&lt;br /&gt;
    &lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;turnIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f_in, open(&amp;quot;turnOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as f_out:&lt;br /&gt;
        n, h = map(int, f_in.readline().split())&lt;br /&gt;
        v = {}&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            line = f_in.readline().split()&lt;br /&gt;
            if len(line) &amp;lt; 2:&lt;br /&gt;
                f_out.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                return&lt;br /&gt;
            x, y = map(int, line)&lt;br /&gt;
            v[i] = {&#039;x&#039;: x, &#039;y&#039;: y}&lt;br /&gt;
        &lt;br /&gt;
        if not check_constraints(n, h, v):&lt;br /&gt;
            f_out.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            st = [0] * 1010&lt;br /&gt;
            uz = [0] * 101&lt;br /&gt;
            back(1, 0, st, uz, v, h, f_out)&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1136_-_Dragoni&amp;diff=9146</id>
		<title>1136 - Dragoni</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1136_-_Dragoni&amp;diff=9146"/>
		<updated>2024-01-06T22:05:33Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == Supărați că lansarea părții a treia a filmului lor preferat s-a amânat până în iunie 2018, Henry și Hetty s-au gândit la propriul scenariu pentru finalul trilogiei:  Într-o lume în care vikingii pot zbura cu dragonii există &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; insule. Hiccup, șeful tribului de vikingi aflat pe insula &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, știe &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; rute directe de zbor bidirecționale între insule. Pentru fiecare &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; intre &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;M&amp;lt;/cod...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Supărați că lansarea părții a treia a filmului lor preferat s-a amânat până în iunie 2018, Henry și Hetty s-au gândit la propriul scenariu pentru finalul trilogiei:&lt;br /&gt;
&lt;br /&gt;
Într-o lume în care vikingii pot zbura cu dragonii există &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; insule. Hiccup, șeful tribului de vikingi aflat pe insula &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, știe &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; rute directe de zbor bidirecționale între insule. Pentru fiecare &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; intre &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, ruta &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; unește insulele &amp;lt;code&amp;gt;Aj&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Bj&amp;lt;/code&amp;gt; și are lungime &amp;lt;code&amp;gt;Dj&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pe fiecare insulă &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, (&amp;lt;code&amp;gt;1 ≤ i ≤ n&amp;lt;/code&amp;gt;) există dragoni din specia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; care pot zbura fără a se opri pentru odihnă o distanță maximă &amp;lt;code&amp;gt;Dmaxi&amp;lt;/code&amp;gt;. Cu alte cuvinte, dragonii de pe insula &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; vor putea parcurge orice rută &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, (&amp;lt;code&amp;gt;1 ≤ j ≤ m&amp;lt;/code&amp;gt;) pentru care &amp;lt;code&amp;gt;Dj ≤ Dmaxi&amp;lt;/code&amp;gt;, indiferent de ce alte drumuri au făcut anterior.&lt;br /&gt;
&lt;br /&gt;
Hiccup dorește să ajungă de pe insula &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; pe insula &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; pentru a-l salva pe Toothless, dragonul lui. Pentru a ajunge acolo, el va lua inițial un dragon din specia &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (de pe insula &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). Apoi, dacă la un moment dat Hiccup se află pe o insula &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, (&amp;lt;code&amp;gt;1 ≤ i ≤ n&amp;lt;/code&amp;gt;) având cu el un dragon din specia &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;, el poate:&lt;br /&gt;
&lt;br /&gt;
# Să zboare de pe insula &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; pe o altă insulă &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; cu dragonul pe care îl are, folosind o rută directă &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; între insulele &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, bineînțeles doar dacă &amp;lt;code&amp;gt;Dj ≤ Dmaxt&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Să schimbe dragonul din specia &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; pe care îl are cu un dragon din specia &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; aflat pe insula respectivă.&lt;br /&gt;
&lt;br /&gt;
= Cerințe =&lt;br /&gt;
a. Să se determine distanța maxima &amp;lt;code&amp;gt;Dmaxi&amp;lt;/code&amp;gt; caracteristică unui dragon la care Hiccup poate ajunge fără a schimba dragonul pe care l-a luat inițial de pe insula &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
b. Să se determine distanța minimă pe care Hiccup trebuie să o parcurgă pentru a ajunge de pe insula &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; pe insula &amp;lt;code&amp;gt;N&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;dragoniIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;. Pentru toate testele de intrare, numărul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; poate avea doar valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau valoarea &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;. Pe a doua linie se găsesc două numere naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; reprezentând numărul de insule, respectiv numărul de rute directe între insule. Pe a treia linie se găsesc &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere naturale, al &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-lea dintre acestea reprezentând distanta maximă &amp;lt;code&amp;gt;Dmaxi&amp;lt;/code&amp;gt; pe care o poate zbura un dragon de pe insula &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii sunt descrise cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; rute directe. Pe fiecare dintre aceste linii se găsesc câte trei numere naturale &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; cu semnificația că există rută bidirecțională de lungime &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; între insulele &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 ieșire =&lt;br /&gt;
n fișierul de ieșire &amp;lt;code&amp;gt;dragoniOUt.txt&amp;lt;/code&amp;gt; se va afișa un singur număr natural.&lt;br /&gt;
&lt;br /&gt;
Dacă valoarea lui &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, se rezolvă numai cerința a.&lt;br /&gt;
&lt;br /&gt;
În acest caz numărul afișat va reprezenta distanța maximă &amp;lt;code&amp;gt;Dmaxi&amp;lt;/code&amp;gt; a unui dragon &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; la care Hiccup poate ajunge fără a schimba dragonul pe care l-a luat inițial de pe insula &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Daca valoarea lui &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, se va rezolva numai cerința b,&lt;br /&gt;
&lt;br /&gt;
În acest caz numărul afișat va reprezenta distanța minima pe care Hiccup trebuie să o parcurgă pentru a ajunge de pe insula &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; pe insula &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.Î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 ≤ 800&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 6000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Dmaxi ≤ 50 000&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Aj, Bj ≤ N&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;1 ≤ j ≤ M&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ Dj ≤ 50 000&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;1 ≤ j ≤ M&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Se garantează că Hiccup poate ajunge pe insula &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Se garantează că răspunsul oricărei cerințe este un număr natural mai mic decât &amp;lt;code&amp;gt;109&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru rezolvarea corectă a primei cerințe se acordă 20% din punctajul testului respectiv.&lt;br /&gt;
* Pentru rezolvarea corectă a celei de-a doua cerințe se acordă 80% din punctajul testului respectiv.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;dragoniIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 5 6&lt;br /&gt;
 6 3 13 20 26&lt;br /&gt;
 1 2 5&lt;br /&gt;
 1 3 7&lt;br /&gt;
 1 5 10&lt;br /&gt;
 2 3 6&lt;br /&gt;
 3 4 5&lt;br /&gt;
 3 5 14&lt;br /&gt;
&amp;lt;code&amp;gt;dragoniOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 20&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
&amp;lt;code&amp;gt;p = 1&amp;lt;/code&amp;gt; deci se va rezolva cerința a).&lt;br /&gt;
&lt;br /&gt;
Există &amp;lt;code&amp;gt;N = 5&amp;lt;/code&amp;gt; insule si &amp;lt;code&amp;gt;M = 6&amp;lt;/code&amp;gt; rute între ele. Hiccup pornește de pe insula &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; având un dragon care poate zbura o distanță de maxim &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;. Cu acest dragon poate ajunge doar pe insulele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;, întrucât pentru a ajunge pe insula &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; el ar fi obligat sa parcurgă o ruta de lungime mai mare decât &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Distanta maxima pe care o poate zbura un dragon aflat pe insulele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; este deci &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt; (dragonul de pe insula &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;). Se observă că dragonul care poate zbura o distanță de &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; se afla pe insula 5 și este inaccesibil.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;dragoniIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 801 6&lt;br /&gt;
 6 3 13 20 26&lt;br /&gt;
 1 2 5&lt;br /&gt;
 1 3 7&lt;br /&gt;
 1 5 10&lt;br /&gt;
 2 3 6&lt;br /&gt;
 3 4 5&lt;br /&gt;
 3 5 14&lt;br /&gt;
&amp;lt;code&amp;gt;dragoniOUt.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;
class Dij:&lt;br /&gt;
    def __init__(self, nod, cost):&lt;br /&gt;
        self.nod = nod&lt;br /&gt;
        self.cost = cost&lt;br /&gt;
&lt;br /&gt;
    def __lt__(self, other):&lt;br /&gt;
        return self.cost &amp;gt; other.cost&lt;br /&gt;
&lt;br /&gt;
def validate_restrictions(n, m, dmax):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 800 and 1 &amp;lt;= m &amp;lt;= 6000):&lt;br /&gt;
        return False&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if not (1 &amp;lt;= dmax[i] &amp;lt;= 50000):&lt;br /&gt;
            return False&lt;br /&gt;
    &lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;dragoniIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;dragoniOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
    p = int(fin.readline())&lt;br /&gt;
    &lt;br /&gt;
    if p == 1:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        dmax = [0] + list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
        if not validate_restrictions(n, m, dmax):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            exit()&lt;br /&gt;
&lt;br /&gt;
        gf = [[] for _ in range(n + 1)]&lt;br /&gt;
&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            a, b, c = map(int, fin.readline().split())&lt;br /&gt;
            if not (1 &amp;lt;= a &amp;lt;= n and 1 &amp;lt;= b &amp;lt;= n and 1 &amp;lt;= c &amp;lt;= 50000):&lt;br /&gt;
                fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                exit()&lt;br /&gt;
            gf[a].append((b, c))&lt;br /&gt;
            gf[b].append((a, c))&lt;br /&gt;
&lt;br /&gt;
        q = []&lt;br /&gt;
        max_val = dmax[1]&lt;br /&gt;
        viz = [False] * (n + 1)&lt;br /&gt;
        viz[1] = True&lt;br /&gt;
        q.append(1)&lt;br /&gt;
&lt;br /&gt;
        while q:&lt;br /&gt;
            nod = q.pop(0)&lt;br /&gt;
&lt;br /&gt;
            for nex in gf[nod]:&lt;br /&gt;
                if nex[1] &amp;lt;= dmax[1] and not viz[nex[0]]:&lt;br /&gt;
                    viz[nex[0]] = True&lt;br /&gt;
                    max_val = max(max_val, dmax[nex[0]])&lt;br /&gt;
                    q.append(nex[0])&lt;br /&gt;
&lt;br /&gt;
        fout.write(str(max_val) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    elif p == 2:&lt;br /&gt;
        n, m = map(int, fin.readline().split())&lt;br /&gt;
        dmax = [0] + list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
        if not validate_restrictions(n, m, dmax):&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            exit()&lt;br /&gt;
&lt;br /&gt;
        cost = [[float(&#039;inf&#039;)] * (n + 1) for _ in range(n + 1)]&lt;br /&gt;
        costmin = [[float(&#039;inf&#039;)] * (n + 1) for _ in range(n + 1)]&lt;br /&gt;
        gf = [[] for _ in range(n + 1)]&lt;br /&gt;
&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            a, b, c = map(int, fin.readline().split())&lt;br /&gt;
            if not (1 &amp;lt;= a &amp;lt;= n and 1 &amp;lt;= b &amp;lt;= n and 1 &amp;lt;= c &amp;lt;= 50000):&lt;br /&gt;
                fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
                exit()&lt;br /&gt;
            gf[a].append((b, c))&lt;br /&gt;
            gf[b].append((a, c))&lt;br /&gt;
&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            pq = []&lt;br /&gt;
            heapq.heappush(pq, Dij(i, 0))&lt;br /&gt;
            cost[i][i] = 0&lt;br /&gt;
&lt;br /&gt;
            while pq:&lt;br /&gt;
                cur = heapq.heappop(pq)&lt;br /&gt;
                nod, costc = cur.nod, cur.cost&lt;br /&gt;
&lt;br /&gt;
                if costc &amp;lt; cost[i][nod]:&lt;br /&gt;
                    continue&lt;br /&gt;
&lt;br /&gt;
                for nex in gf[nod]:&lt;br /&gt;
                    if nex[1] &amp;lt;= dmax[i] and costc + nex[1] &amp;lt; cost[i][nex[0]]:&lt;br /&gt;
                        cost[i][nex[0]] = costc + nex[1]&lt;br /&gt;
                        heapq.heappush(pq, Dij(nex[0], cost[i][nex[0]]))&lt;br /&gt;
&lt;br /&gt;
        class Stare:&lt;br /&gt;
            def __init__(self, nod, cost, dragon):&lt;br /&gt;
                self.nod = nod&lt;br /&gt;
                self.cost = cost&lt;br /&gt;
                self.dragon = dragon&lt;br /&gt;
&lt;br /&gt;
        q = []&lt;br /&gt;
        q.append(Stare(1, 0, 1))&lt;br /&gt;
        costfinalmin = float(&#039;inf&#039;)&lt;br /&gt;
        costmin[1][1] = 0&lt;br /&gt;
&lt;br /&gt;
        while q:&lt;br /&gt;
            cur = q.pop(0)&lt;br /&gt;
            nod, costc, dragon = cur.nod, cur.cost, cur.dragon&lt;br /&gt;
&lt;br /&gt;
            if costc &amp;gt; costmin[dragon][nod]:&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            for nex in gf[nod]:&lt;br /&gt;
                if nex[1] &amp;lt;= dmax[dragon]:&lt;br /&gt;
                    nexcost = costc + nex[1]&lt;br /&gt;
                    nexdrag = dragon&lt;br /&gt;
                    if dmax[nex[0]] &amp;gt; dmax[dragon]:&lt;br /&gt;
                        nexdrag = nex[0]&lt;br /&gt;
                    elif dmax[nex[0]] == dmax[dragon]:&lt;br /&gt;
                        nexdrag = min(dragon, nex[0])&lt;br /&gt;
&lt;br /&gt;
                    if nexcost &amp;gt;= costmin[nexdrag][nex[0]]:&lt;br /&gt;
                        continue&lt;br /&gt;
&lt;br /&gt;
                    costmin[nexdrag][nex[0]] = nexcost&lt;br /&gt;
                    q.append(Stare(nex[0], nexcost, nexdrag))&lt;br /&gt;
&lt;br /&gt;
                    costfinalmin = min(costfinalmin, costmin[nexdrag][nex[0]] + cost[nexdrag][nex[0]])&lt;br /&gt;
&lt;br /&gt;
        fout.write(str(costfinalmin) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2165_-_Graf_1&amp;diff=9145</id>
		<title>2165 - Graf 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2165_-_Graf_1&amp;diff=9145"/>
		<updated>2024-01-06T21:39:45Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == Se știe că într-un graf neorientat conex, între oricare două vârfuri există cel putin un lanț iar lungimea unui lanț este egală cu numărul muchiilor care-l compun. Definim noțiunea lanț optim între două vârfuri &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; ca fiind un lanț de lungime minimă care are ca extremități vârfurile &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;. Este evident că între oricare două vârfuri ale unui graf conex vom avea unul sau mai multe la...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Se știe că într-un graf neorientat conex, între oricare două vârfuri există cel putin un lanț iar lungimea unui lanț este egală cu numărul muchiilor care-l compun. Definim noțiunea lanț optim între două vârfuri &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; ca fiind un lanț de lungime minimă care are ca extremități vârfurile &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;. Este evident că între oricare două vârfuri ale unui graf conex vom avea unul sau mai multe lanțuri optime, depinzând de configurația grafului.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Fiind dat un graf neorientat conex cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; vârfuri etichetate cu numerele de ordine &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, …, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și două vârfuri ale sale notate &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1 ≤ X, Y ≤ N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X≠Y&amp;lt;/code&amp;gt; ), se cere să scrieți un program care determină vârfurile care aparțin tuturor lanțurilor optime dintre &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&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;graf1.in&amp;lt;/code&amp;gt; conține pe prima linie patru numere naturale reprezentând: &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (numărul de vârfuri ale grafului), &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; (numărul de muchii), &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; (cu semnificația din enunț). Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii câte două numere naturale nenule &amp;lt;code&amp;gt;A[i], B[i]&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1 ≤ A[i], B[i] ≤ N&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;A[i] ≠ B[i]&amp;lt;/code&amp;gt;, pentru &amp;lt;code&amp;gt;1 ≤ i ≤ M&amp;lt;/code&amp;gt; ) fiecare dintre aceste perechi de numere reprezentând câte o muchie din graf.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;graf1.out&amp;lt;/code&amp;gt; va conține pe prima linie, numărul de vârfuri comune tuturor lanțurilor optime dintre &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;; pe a doua linie, numerele corespunzătoare etichetelor acestor vârfuri, dispuse în ordine crescătoare; între două numere consecutive de pe această linie se va afla câte 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;2 ≤ N ≤ 7500&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 14000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;graf1.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 7 1 4&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 6&lt;br /&gt;
 2 5&lt;br /&gt;
 3 5&lt;br /&gt;
 5 6&lt;br /&gt;
 5 4&lt;br /&gt;
&amp;lt;code&amp;gt;graf1.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 3&lt;br /&gt;
 1 4 5&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;graf1.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 7501 7 1 4&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 6&lt;br /&gt;
 2 5&lt;br /&gt;
 3 5&lt;br /&gt;
 5 6&lt;br /&gt;
 5 4&lt;br /&gt;
&amp;lt;code&amp;gt;graf1.out&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 deque&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, m):&lt;br /&gt;
    return 2 &amp;lt;= n &amp;lt;= 7500 and 1 &amp;lt;= m &amp;lt;= 14000&lt;br /&gt;
&lt;br /&gt;
def bfs(start, dist, E):&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        dist[i] = float(&#039;inf&#039;)&lt;br /&gt;
    &lt;br /&gt;
    q = deque([start])&lt;br /&gt;
    dist[start] = 0&lt;br /&gt;
    &lt;br /&gt;
    while q:&lt;br /&gt;
        nn = q.popleft()&lt;br /&gt;
        for i in E[nn]:&lt;br /&gt;
            if dist[i] == float(&#039;inf&#039;):&lt;br /&gt;
                dist[i] = dist[nn] + 1&lt;br /&gt;
                q.append(i)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;graf1IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n, m, x, y = map(int, f.readline().split())&lt;br /&gt;
        &lt;br /&gt;
        if not check_constraints(n, m):&lt;br /&gt;
            with open(&amp;quot;graf1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                g.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            exit()&lt;br /&gt;
&lt;br /&gt;
        E = [[] for _ in range(n + 1)]&lt;br /&gt;
&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            a, b = map(int, f.readline().split())&lt;br /&gt;
            E[a].append(b)&lt;br /&gt;
            E[b].append(a)&lt;br /&gt;
&lt;br /&gt;
    dist1 = [0] * (n + 1)&lt;br /&gt;
    dist2 = [0] * (n + 1)&lt;br /&gt;
    fr = [0] * (n + 1)&lt;br /&gt;
    rez = []&lt;br /&gt;
&lt;br /&gt;
    bfs(x, dist1, E)&lt;br /&gt;
    bfs(y, dist2, E)&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if dist1[i] + dist2[i] == dist1[y]:&lt;br /&gt;
            fr[dist1[i]] += 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if dist1[i] != float(&#039;inf&#039;) and dist2[i] != float(&#039;inf&#039;) and dist1[y] != float(&#039;inf&#039;):&lt;br /&gt;
            if dist1[i] + dist2[i] == dist1[y] and fr[dist1[i]] == 1:&lt;br /&gt;
                rez.append(i)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;graf1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
        if rez:&lt;br /&gt;
            g.write(str(len(rez)) + &#039;\n&#039;)&lt;br /&gt;
            g.write(&amp;quot; &amp;quot;.join(map(str, rez)))&lt;br /&gt;
        else:&lt;br /&gt;
            g.write(&amp;quot;Nu exista noduri care sa corespunda conditiilor.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1118_-_Clepsidra&amp;diff=9144</id>
		<title>1118 - Clepsidra</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1118_-_Clepsidra&amp;diff=9144"/>
		<updated>2024-01-06T21:26:53Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă:  Un graf conex cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; muchii poate fi privit ca o clepsidră cu centrul în nodul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ X ≤ N&amp;lt;/code&amp;gt;, dacă putem împărți toate nodurile, mai puțin nodul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, în două submulțimi nevide astfel încât orice drum de la un nod dintr-o mulțime la un nod din cealaltă mulțime trece prin nodul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;. Voi trebuie să determinați numărul de moduri distincte în care putem privi graful ca o cle...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Un graf conex cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; muchii poate fi privit ca o clepsidră cu centrul în nodul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ X ≤ N&amp;lt;/code&amp;gt;, dacă putem împărți toate nodurile, mai puțin nodul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, în două submulțimi nevide astfel încât orice drum de la un nod dintr-o mulțime la un nod din cealaltă mulțime trece prin nodul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;. Voi trebuie să determinați numărul de moduri distincte în care putem privi graful ca o clepsidră pentru fiecare din cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri alese drept centru, modulo &amp;lt;code&amp;gt;666013&amp;lt;/code&amp;gt;. Două moduri se consideră distincte dacă cele două submulțimi aferente sunt diferite. Ordinea submulțimilor într-un mod este relevantă, dar ordinea nodurilor în cadrul unei mulțimi nu este. Spre exemplu, soluțiile &amp;lt;code&amp;gt;({1,2,3}, {4,5})&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;({4,5}, {1,2,3})&amp;lt;/code&amp;gt; sunt distincte, dar soluţiile &amp;lt;code&amp;gt;({4,5}, {1,2,3})&amp;lt;/code&amp;gt; şi &amp;lt;code&amp;gt;({4,5}, {1,3,2})&amp;lt;/code&amp;gt; nu sunt distincte.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;clepsidra.in&amp;lt;/code&amp;gt; conține pe prima linie două numere naturale, &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, reprezentând numărul de noduri, respectiv numărul de muchii din graf. Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se vor afla câte două numere naturale separate prin câte un spaţiu, reprezentând câte o muchie.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;clepsidra.out&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii. A &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;-a linie, &amp;lt;code&amp;gt;1 ≤ i ≤ N&amp;lt;/code&amp;gt;, va conține numărul de moduri în care putem privi graful ca o clepsidră cu centrul în nodul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, modulo &amp;lt;code&amp;gt;666013&amp;lt;/code&amp;gt;.Î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;2 ≤ N ≤ 200 002&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ M ≤ 250 002&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 40% din teste avem restricţiile &amp;lt;code&amp;gt;2 ≤ N ≤ 1002&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;1 ≤ M ≤ 1502&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Atentie! Graful este conex.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;clepsidra.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 7&lt;br /&gt;
 4 3&lt;br /&gt;
 1 3&lt;br /&gt;
 5 4&lt;br /&gt;
 4 1&lt;br /&gt;
 3 2&lt;br /&gt;
 1 5&lt;br /&gt;
 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;clepsidra.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 0&lt;br /&gt;
 0&lt;br /&gt;
 2&lt;br /&gt;
 0&lt;br /&gt;
 2&lt;br /&gt;
 0&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Pentru nodul cu indicele &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, soluţiile sunt: &amp;lt;code&amp;gt;({2}, {1,4,5,6})&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;({1,4,5,6}, {2})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru nodul cu indicele &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;, soluţiile sunt: &amp;lt;code&amp;gt;({6}, {1,2,3,4})&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;({1,2,3,4},{6})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;clepsidra.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 200200 213&lt;br /&gt;
 4 3&lt;br /&gt;
 1 3&lt;br /&gt;
 5 4&lt;br /&gt;
 4 1&lt;br /&gt;
 3 2&lt;br /&gt;
 1 5&lt;br /&gt;
 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;clepsidra.out&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;
MOD = 666013&lt;br /&gt;
&lt;br /&gt;
def power(x, y):&lt;br /&gt;
    rez = 1&lt;br /&gt;
    while y &amp;gt; 0:&lt;br /&gt;
        if y % 2 == 1:&lt;br /&gt;
            rez = (rez * x) % MOD&lt;br /&gt;
        x = (x * x) % MOD&lt;br /&gt;
        y = y // 2&lt;br /&gt;
    return rez % MOD&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, m):&lt;br /&gt;
    if 2 &amp;lt;= n &amp;lt;= 200002 and 1 &amp;lt;= m &amp;lt;= 250002:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        with open(&amp;quot;clepsidraOUT.txt&amp;quot;, &#039;w&#039;) as out:&lt;br /&gt;
            out.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def dfs(nc):&lt;br /&gt;
    global niv, nmin, nrfii, tati, viz, a, r&lt;br /&gt;
&lt;br /&gt;
    viz[nc] = 1&lt;br /&gt;
    niv[nc] = niv[tati[nc]] + 1&lt;br /&gt;
    nmin[nc] = niv[nc]&lt;br /&gt;
    for nv in a[nc]:&lt;br /&gt;
        if viz[nv] == 0:&lt;br /&gt;
            tati[nv] = nc&lt;br /&gt;
            dfs(nv)&lt;br /&gt;
            nmin[nc] = min(nmin[nc], nmin[nv])&lt;br /&gt;
            if nc != r and nmin[nv] &amp;gt;= niv[nc]:&lt;br /&gt;
                nrfii[nc] += 1&lt;br /&gt;
&lt;br /&gt;
        elif tati[nc] != nv:&lt;br /&gt;
            nmin[nc] = min(nmin[nc], niv[nv])&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global niv, nmin, nrfii, tati, viz, a, r&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;clepsidraIN.txt&amp;quot;, &#039;r&#039;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
        &lt;br /&gt;
        if not check_constraints(n, m):&lt;br /&gt;
            return&lt;br /&gt;
        &lt;br /&gt;
        a = [[] for _ in range(n + 1)]&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            x, y = map(int, f.readline().split())&lt;br /&gt;
            a[x].append(y)&lt;br /&gt;
            a[y].append(x)&lt;br /&gt;
&lt;br /&gt;
    r = 1&lt;br /&gt;
    niv = [0] * (n + 1)&lt;br /&gt;
    nmin = [0] * (n + 1)&lt;br /&gt;
    nrfii = [0] * (n + 1)&lt;br /&gt;
    tati = [0] * (n + 1)&lt;br /&gt;
    viz = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
    dfs(r)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;clepsidraOUT.txt&amp;quot;, &#039;w&#039;) as out:&lt;br /&gt;
        if nrfii[r] &amp;gt; 1:&lt;br /&gt;
            out.write(str((power(2, nrfii[r]) + MOD - 2) % MOD) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            out.write(&amp;quot;0\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        for i in range(2, n + 1):&lt;br /&gt;
            if nrfii[i] == 0:&lt;br /&gt;
                out.write(&amp;quot;0\n&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                out.write(str((power(2, nrfii[i] + 1) + MOD - 2) % MOD) + &amp;quot;\n&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3364_-_Unire&amp;diff=9143</id>
		<title>3364 - Unire</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3364_-_Unire&amp;diff=9143"/>
		<updated>2024-01-06T21:10:54Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Gigel are un graf cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; muchii, care nu este conex. El dorește să afle răspunsul la două întrebări:  1) Care este numărul minim de muchii ce trebuie ađugate astfel încât graful să devină conex?  2) Dacă costul adăugării unei muchii între nodurile &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;a + b&amp;lt;/code&amp;gt;, care este costul total minim al muchiilor care trebuie adăugate astfel încât graful să devină conex?...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Gigel are un graf cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; muchii, care nu este conex. El dorește să afle răspunsul la două întrebări:&lt;br /&gt;
&lt;br /&gt;
1) Care este numărul minim de muchii ce trebuie ađugate astfel încât graful să devină conex?&lt;br /&gt;
&lt;br /&gt;
2) Dacă costul adăugării unei muchii între nodurile &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; este &amp;lt;code&amp;gt;a + b&amp;lt;/code&amp;gt;, care este costul total minim al muchiilor care trebuie adăugate astfel încât graful să devină conex?&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;unireIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, pe a doua linie conține numărul &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;, reprezentând numărul cerinței &amp;lt;code&amp;gt;1 ≤ c ≤ 2&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii se află muchiile grafului &amp;lt;code&amp;gt;a b&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ a, b ≤ n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;a ≠ b&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;unireOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, reprezentând răspunsul cerut de Gigel.Î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 ≤ 100000&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0 ≤ m &amp;lt; n-1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru teste în valoare de &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; de puncte, cerința va fi &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Pentru teste în valoare de &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; de puncte, &amp;lt;code&amp;gt;1 ≤ n ≤ 1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;unireIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 3&lt;br /&gt;
 1&lt;br /&gt;
 1 2&lt;br /&gt;
 3 4&lt;br /&gt;
 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;unireOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;unireIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1000001 3&lt;br /&gt;
 1&lt;br /&gt;
 1 2&lt;br /&gt;
 3 4&lt;br /&gt;
 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;unireOUT.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 check_restrictions(n, m):&lt;br /&gt;
    return not (1 &amp;lt;= n &amp;lt;= 100000 and 0 &amp;lt;= m &amp;lt; n - 1)&lt;br /&gt;
&lt;br /&gt;
def dfs(v, c, C, G):&lt;br /&gt;
    C[v] = c&lt;br /&gt;
    for i in G[v]:&lt;br /&gt;
        if not C[i]:&lt;br /&gt;
            dfs(i, c, C, G)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;unireIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as input_file, open(&amp;quot;unireOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
        n, m = map(int, input_file.readline().split())&lt;br /&gt;
&lt;br /&gt;
        if check_restrictions(n, m):&lt;br /&gt;
            output_file.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        c = int(input_file.readline().strip())&lt;br /&gt;
&lt;br /&gt;
        G = [[] for _ in range(100001)]&lt;br /&gt;
        C = [0] * 100001&lt;br /&gt;
        nc = 0&lt;br /&gt;
        f = [0] * 100001&lt;br /&gt;
        s = 0&lt;br /&gt;
&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            x, y = map(int, input_file.readline().split())&lt;br /&gt;
            G[x].append(y)&lt;br /&gt;
            G[y].append(x)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            if not C[i]:&lt;br /&gt;
                nc += 1&lt;br /&gt;
                dfs(i, i, C, G)&lt;br /&gt;
&lt;br /&gt;
        if c == 1:&lt;br /&gt;
            output_file.write(str(nc - 1) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            C.sort()&lt;br /&gt;
            for i in range(2, n + 1):&lt;br /&gt;
                if C[1] != C[i] and f[C[i]] == 0:&lt;br /&gt;
                    s += (C[1] + C[i])&lt;br /&gt;
                f[C[i]] += 1&lt;br /&gt;
&lt;br /&gt;
            output_file.write(str(s) + &amp;quot;\n&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1691_-_Arbore_1&amp;diff=9142</id>
		<title>1691 - Arbore 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1691_-_Arbore_1&amp;diff=9142"/>
		<updated>2024-01-06T20:55:00Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Se dă un arbore (graf conex aciclic) cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri. Vrem să eliminăm noduri (împreună cu muchiile adiacente) din arborele dat, astfel încât numărul de componente conexe ale grafului rămas să fie maxim. Aflați care este numărul maxim de componente conexe pe care le putem obține și câte submulțimi distincte de noduri se pot elimina din arbore astfel încât să rămână la final acest număr maxim de componente conexe.  = Date de intrare...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un arbore (graf conex aciclic) cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri. Vrem să eliminăm noduri (împreună cu muchiile adiacente) din arborele dat, astfel încât numărul de componente conexe ale grafului rămas să fie maxim. Aflați care este numărul maxim de componente conexe pe care le putem obține și câte submulțimi distincte de noduri se pot elimina din arbore astfel încât să rămână la final acest număr maxim de componente conexe.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;arbore1IN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, reprezentând numărul de noduri ale arborelui. Pe următoarele &amp;lt;code&amp;gt;N-1&amp;lt;/code&amp;gt; linii se vor afla câte două numere &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;, cu semnificația că există o muchie între nodurile &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; și &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;arbore1OUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie două numere naturale reprezentând numărul maxim de componente conexe pe care îl putem obține, respectiv numărul de moduri în care putem obține acest număr de componente conexe modulo &amp;lt;code&amp;gt;10^9+7&amp;lt;/code&amp;gt; (adică restul împărțirii acestui număr la &amp;lt;code&amp;gt;1000000007&amp;lt;/code&amp;gt;).Î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 ≤ 100 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se acordă 40% din punctajul unui test dacă numărul maxim de componente conexe este corect.&lt;br /&gt;
* Se acordă 60% din punctajul unui test dacă numărul de moduri este corect.&lt;br /&gt;
* Pentru 20% din teste &amp;lt;code&amp;gt;N ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru alte 30% din teste &amp;lt;code&amp;gt;N ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;arbore1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 4&lt;br /&gt;
 4 5&lt;br /&gt;
 4 6&lt;br /&gt;
&amp;lt;code&amp;gt;arbore1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 1&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Se șterg nodurile &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;. Nicio altă submulțime de noduri șterse nu produce &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; sau mai multe componente conexe.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
&amp;lt;code&amp;gt;arbore1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100001&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 4&lt;br /&gt;
 4 5&lt;br /&gt;
 4 6&lt;br /&gt;
&amp;lt;code&amp;gt;arbore1OUT.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;
N = 100100&lt;br /&gt;
mod = 1000000007&lt;br /&gt;
&lt;br /&gt;
v = defaultdict(list)&lt;br /&gt;
D = [[0] * N for _ in range(3)]&lt;br /&gt;
W = [[1] * N for _ in range(3)]&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000):&lt;br /&gt;
        with open(&amp;quot;arbore1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
            output_file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
def dfs(x, p):&lt;br /&gt;
    D[1][x] = 1&lt;br /&gt;
    D[0][x] = 0&lt;br /&gt;
    D[2][x] = 1&lt;br /&gt;
    W[1][x] = 1&lt;br /&gt;
    W[0][x] = 1&lt;br /&gt;
    W[2][x] = 1&lt;br /&gt;
    &lt;br /&gt;
    for it in v[x]:&lt;br /&gt;
        if it != p:&lt;br /&gt;
            dfs(it, x)&lt;br /&gt;
    &lt;br /&gt;
    # Cazul 1. Stergem nodul&lt;br /&gt;
    for it in v[x]:&lt;br /&gt;
        if it != p:&lt;br /&gt;
            D[0][x] += D[2][it]&lt;br /&gt;
            W[0][x] *= W[2][it]&lt;br /&gt;
            W[0][x] %= mod&lt;br /&gt;
    &lt;br /&gt;
    # Cazul 2. Nu stergem nodul&lt;br /&gt;
    for it in v[x]:&lt;br /&gt;
        if it != p:&lt;br /&gt;
            if D[0][it] + 1 == D[1][it]:&lt;br /&gt;
                W[1][x] *= (W[0][it] + W[1][it]) % mod&lt;br /&gt;
                W[1][x] %= mod&lt;br /&gt;
                D[1][x] += D[0][it]&lt;br /&gt;
            elif D[0][it] + 1 &amp;lt; D[1][it]:&lt;br /&gt;
                W[1][x] *= W[1][it]&lt;br /&gt;
                W[1][x] %= mod&lt;br /&gt;
                D[1][x] += D[1][it] - 1&lt;br /&gt;
            else:&lt;br /&gt;
                W[1][x] *= W[0][it]&lt;br /&gt;
                W[1][x] %= mod&lt;br /&gt;
                D[1][x] += D[0][it]&lt;br /&gt;
    &lt;br /&gt;
    # Calculam solutia pentru acest subarbore stiind cele 2 cazuri&lt;br /&gt;
    D[2][x] = max(D[1][x], D[0][x])&lt;br /&gt;
    if D[1][x] == D[0][x]:&lt;br /&gt;
        W[2][x] = (W[1][x] + W[0][x]) % mod&lt;br /&gt;
    elif D[1][x] &amp;gt; D[0][x]:&lt;br /&gt;
        W[2][x] = W[1][x]&lt;br /&gt;
    else:&lt;br /&gt;
        W[2][x] = W[0][x]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;arbore1IN.txt&amp;quot;, &amp;quot;r&amp;quot;) as input_file:&lt;br /&gt;
        n = int(input_file.readline().strip())&lt;br /&gt;
        check_constraints(n)&lt;br /&gt;
        &lt;br /&gt;
        for _ in range(n-1):&lt;br /&gt;
            x, y = map(int, input_file.readline().strip().split())&lt;br /&gt;
            v[x].append(y)&lt;br /&gt;
            v[y].append(x)&lt;br /&gt;
&lt;br /&gt;
    dfs(1, 0)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;arbore1OUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
        output_file.write(f&amp;quot;{D[2][1]} {W[2][1]}&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1825_-_Zoomba&amp;diff=9141</id>
		<title>1825 - Zoomba</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1825_-_Zoomba&amp;diff=9141"/>
		<updated>2024-01-06T20:37:24Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Enunț = În țara Zoomba trăiesc &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; prieteni, fiecare în localități diferite. În această țară se găsesc &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; orașe, oricare două fiind legate prin cel mult o șosea bidirecțională. Deoarece nu s-au mai întâlnit de mult, cei &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; prieteni s-au hotărât să se reîntâlnească într-un oraș. Fiecare are câte o mașină cu număr nelimitat de locuri. Pentru a trece de la un oraș la altul, o mașină consumă &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; li...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Enunț =&lt;br /&gt;
În țara Zoomba trăiesc &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; prieteni, fiecare în localități diferite. În această țară se găsesc &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; orașe, oricare două fiind legate prin cel mult o șosea bidirecțională. Deoarece nu s-au mai întâlnit de mult, cei &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; prieteni s-au hotărât să se reîntâlnească într-un oraș. Fiecare are câte o mașină cu număr nelimitat de locuri. Pentru a trece de la un oraș la altul, o mașină consumă &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; litru de benzină.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Știind că odată ce au ajuns în același oraș &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; sau mai mulți prieteni, aceștia iși pot continua drumul cu o singură mașină, să se determine consumul minim de benzină pentru ca aceștia să ajungă în orașul &amp;lt;code&amp;gt;Z&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;zoombaIN.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;(numărul de șosele), &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt;. Pe următoarea linie se află &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; numere, reprezentând pozițiile inițiale ale celor &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; prieteni. Pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se află câte o pereche &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există șosea de la orașul &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; la orașul &amp;lt;code&amp;gt;j&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;zoombaOUt.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, ce va fi egal cu consumul minim de combustibil necesar ca cei &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; prieteni să se întâlnească în orașul &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt;, sau &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; în cazul în care aceștia nu pot ajunge în el.Î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 ≤ Z ≤ N ≤ 200&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ K ≤ min(N,10)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;zoombaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 4 3 5&lt;br /&gt;
 1 2 3&lt;br /&gt;
 1 4&lt;br /&gt;
 2 4&lt;br /&gt;
 3 4&lt;br /&gt;
 4 5&lt;br /&gt;
&amp;lt;code&amp;gt;zoombaOUt.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;zoombaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 201 4 3 5&lt;br /&gt;
 1 2 3&lt;br /&gt;
 1 4&lt;br /&gt;
 2 4&lt;br /&gt;
 3 4&lt;br /&gt;
 4 5&lt;br /&gt;
&amp;lt;code&amp;gt;zoombaOUt.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 deque&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, k, z):&lt;br /&gt;
    if not (1 &amp;lt;= z &amp;lt;= n &amp;lt;= 200 and 1 &amp;lt;= k &amp;lt;= min(n, 10)):&lt;br /&gt;
        with open(&#039;zoombaOUT.txt&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        sys.exit()&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    kmax = 10&lt;br /&gt;
    nmax = 203&lt;br /&gt;
    inf = int(1e9)&lt;br /&gt;
&lt;br /&gt;
    def lee(v):&lt;br /&gt;
        while coada:&lt;br /&gt;
            k = coada.popleft()&lt;br /&gt;
            for i in range(len(g[k])):&lt;br /&gt;
                if dp[g[k][i]][v] &amp;gt; dp[k][v] + 1:&lt;br /&gt;
                    dp[g[k][i]][v] = dp[k][v] + 1&lt;br /&gt;
                    coada.append(g[k][i])&lt;br /&gt;
&lt;br /&gt;
    def construct(l):&lt;br /&gt;
        ret = 0&lt;br /&gt;
        i = 0&lt;br /&gt;
        while l:&lt;br /&gt;
            ret ^= (1 &amp;lt;&amp;lt; i)&lt;br /&gt;
            i += 1&lt;br /&gt;
            l -= 1&lt;br /&gt;
        return ret&lt;br /&gt;
&lt;br /&gt;
    def nbiti(x):&lt;br /&gt;
        k = 0&lt;br /&gt;
        while x:&lt;br /&gt;
            k += (x &amp;amp; 1)&lt;br /&gt;
            x &amp;gt;&amp;gt;= 1&lt;br /&gt;
        return k&lt;br /&gt;
&lt;br /&gt;
    # Redirect input and output to files&lt;br /&gt;
    sys.stdin = open(&#039;zoombaIN.txt&#039;, &#039;r&#039;)&lt;br /&gt;
    sys.stdout = open(&#039;zoombaOUT.txt&#039;, &#039;w&#039;)&lt;br /&gt;
&lt;br /&gt;
    n, m, k, z = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    # Check constraints and exit if not met&lt;br /&gt;
    check_constraints(n, k, z)&lt;br /&gt;
&lt;br /&gt;
    a = list(map(int, input().split()))&lt;br /&gt;
    g = [[] for _ in range(nmax)]&lt;br /&gt;
    dp = [[inf] * (1 &amp;lt;&amp;lt; (kmax + 1)) for _ in range(nmax)]&lt;br /&gt;
    coada = deque()&lt;br /&gt;
&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        i, j = map(int, input().split())&lt;br /&gt;
        g[i].append(j)&lt;br /&gt;
        g[j].append(i)&lt;br /&gt;
&lt;br /&gt;
    for i in range(k):&lt;br /&gt;
        dp[a[i]][1 &amp;lt;&amp;lt; i] = 0&lt;br /&gt;
        coada.append(a[i])&lt;br /&gt;
        lee(1 &amp;lt;&amp;lt; i)&lt;br /&gt;
&lt;br /&gt;
    for l in range(2, k + 1):&lt;br /&gt;
        for j in range(construct(l), (1 &amp;lt;&amp;lt; k)):&lt;br /&gt;
            if nbiti(j) == l:&lt;br /&gt;
                for i in range(1, n + 1):&lt;br /&gt;
                    for c in range(1, j):&lt;br /&gt;
                        if (j | c) == j:&lt;br /&gt;
                            dp[i][j] = min(dp[i][j], dp[i][c] + dp[i][j ^ c])&lt;br /&gt;
                    coada.append(i)&lt;br /&gt;
                lee(j)&lt;br /&gt;
&lt;br /&gt;
    result = dp[z][(1 &amp;lt;&amp;lt; k) - 1] if dp[z][(1 &amp;lt;&amp;lt; k) - 1] != inf else -1&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
    # Close the files&lt;br /&gt;
    sys.stdin.close()&lt;br /&gt;
    sys.stdout.close()&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2041_-_Camelot&amp;diff=9140</id>
		<title>2041 - Camelot</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2041_-_Camelot&amp;diff=9140"/>
		<updated>2024-01-06T20:32:36Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Regele Arthur – Inimă de Leu, vrea să adune la castel toţi cavalerii &amp;#039;&amp;#039;Mesei Rotunde&amp;#039;&amp;#039; pentru a hotărî împreună soarta regatului. Dar cavalerii nu se află toţi în &amp;#039;&amp;#039;Camelot&amp;#039;&amp;#039; şi durează un timp până vor ajunge la castel din pădurea care înconjoară castelul.  Harta pădurii are forma unei matrici, cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane. Pentru fiecare cavaler care nu este în &amp;#039;&amp;#039;Camelot&amp;#039;&amp;#039; se cunosc coordonatele &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt;, repre...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Regele Arthur – Inimă de Leu, vrea să adune la castel toţi cavalerii &#039;&#039;Mesei Rotunde&#039;&#039; pentru a hotărî împreună soarta regatului. Dar cavalerii nu se află toţi în &#039;&#039;Camelot&#039;&#039; şi durează un timp până vor ajunge la castel din pădurea care înconjoară castelul.&lt;br /&gt;
&lt;br /&gt;
Harta pădurii are forma unei matrici, cu &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii şi &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; coloane. Pentru fiecare cavaler care nu este în &#039;&#039;Camelot&#039;&#039; se cunosc coordonatele &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt;, reprezentând linia şi coloana din matrice în care se află iniţial cavalerul. Toţi cavalerii pornesc simultan spre castel, iar fiecare cavaler se deplasează după regula de deplasare a calului de la jocul de şah.&lt;br /&gt;
&lt;br /&gt;
Cunoscând dimensiunile &amp;lt;code&amp;gt;mxn&amp;lt;/code&amp;gt; ale matricei, coordonatele castelului şi cele ale cavalerilor, se cere să se determine:&lt;br /&gt;
&lt;br /&gt;
1. numărul minim de mutări după care va ajunge la castel unul dintre cavaleri&lt;br /&gt;
&lt;br /&gt;
2. numărul minim de mutări după care toţi cavalerii se vor afla la castel.&lt;br /&gt;
&lt;br /&gt;
De exemplu, în imaginea de mai sus este reprezentată harta sub forma unei matrici de tip &amp;lt;code&amp;gt;8x8&amp;lt;/code&amp;gt;, iar castelul are coordonatele &amp;lt;code&amp;gt;4 5&amp;lt;/code&amp;gt; (linia &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; şi coloana &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;), primul cavaler se află iniţial în punctul de coordonate &amp;lt;code&amp;gt;1 2&amp;lt;/code&amp;gt; iar cel de al doilea în punctul &amp;lt;code&amp;gt;8 1&amp;lt;/code&amp;gt;. Primul cavaler va ajunge la castel din minim &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; deplasări, iar al doilea după minim &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mutări Pentru prima întrebare răspunsul este &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, iar pentru a doua întrebare răspunsul este &amp;lt;code&amp;gt;4&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;camelotIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, pentru toate testele de intrare numărul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; putând avea doar valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; sau valoarea &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pe cea de a doua linie sunt scrise numerele naturale &amp;lt;code&amp;gt;m n k&amp;lt;/code&amp;gt;, separate prin câte un spaţiu, iar pe a treia linie se află coordonatele &amp;lt;code&amp;gt;xc yc&amp;lt;/code&amp;gt; ale castelului. 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; perechi de numere întregi &amp;lt;code&amp;gt;x[i] y[i]&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1 ≤ i ≤ k&amp;lt;/code&amp;gt;), separate prin câte un spaţiu, reprezentând coordonatele cavalerilor.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;camelotOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie:&lt;br /&gt;
&lt;br /&gt;
* pentru &amp;lt;code&amp;gt;p=1&amp;lt;/code&amp;gt;, pe prima linie se va scrie numărul minim de mutări după care va ajunge unul din cavaleri&lt;br /&gt;
* pentru &amp;lt;code&amp;gt;p=2&amp;lt;/code&amp;gt;, pe prima linie se va scrie numărul minim de mutări după care vor ajunge toţi cavalerii. Î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;5 ≤ m,n ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ x[i]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xc ≤ m&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1 ≤ y[i]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yc ≤ n&amp;lt;/code&amp;gt;, pentru orice &amp;lt;code&amp;gt;1 ≤ i ≤ k&amp;lt;/code&amp;gt;&lt;br /&gt;
* Eventualele intersecţii ale drumurilor cavalerilor nu influenţează rezultatele&lt;br /&gt;
* Pentru datele de test se garantează existenţa unei soluţii&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;camelotIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 8 8 2&lt;br /&gt;
 4 5&lt;br /&gt;
 1 2&lt;br /&gt;
 8 1&lt;br /&gt;
&amp;lt;code&amp;gt;camelotOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;camelotIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1&lt;br /&gt;
 1001 8 2&lt;br /&gt;
 4 5&lt;br /&gt;
 1 2&lt;br /&gt;
 8 1&lt;br /&gt;
&amp;lt;code&amp;gt;camelotOUT.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 deque&lt;br /&gt;
&lt;br /&gt;
dx = [-2, -2, -1, -1, 1, 1, 2, 2]&lt;br /&gt;
dy = [1, -1, -2, 2, -2, 2, -1, 1]&lt;br /&gt;
&lt;br /&gt;
def inmat(i, j, n, m):&lt;br /&gt;
    return 1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= m&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, m, k, c1, c2, positions):&lt;br /&gt;
    if not (5 &amp;lt;= n &amp;lt;= 1000 and 5 &amp;lt;= m &amp;lt;= 1000):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    if not (1 &amp;lt;= k &amp;lt;= 1000):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    if not (1 &amp;lt;= c1 &amp;lt;= m and 1 &amp;lt;= c2 &amp;lt;= n):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
    for x, y in positions:&lt;br /&gt;
        if not (1 &amp;lt;= x &amp;lt;= m and 1 &amp;lt;= y &amp;lt;= n):&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 lee(ir, jr, n, m, b, q):&lt;br /&gt;
    b[ir][jr] = 1&lt;br /&gt;
    q.append((ir, jr))&lt;br /&gt;
    &lt;br /&gt;
    while q:&lt;br /&gt;
        x, y = q.popleft()&lt;br /&gt;
        for d in range(8):&lt;br /&gt;
            ii, jj = x + dx[d], y + dy[d]&lt;br /&gt;
            if inmat(ii, jj, n, m) and b[ii][jj] == 0:&lt;br /&gt;
                b[ii][jj] = b[x][y] + 1&lt;br /&gt;
                q.append((ii, jj))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;camelotIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin, open(&amp;quot;camelotOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        op = int(fin.readline().strip())&lt;br /&gt;
        n, m, k = map(int, fin.readline().strip().split())&lt;br /&gt;
        c1, c2 = map(int, fin.readline().strip().split())&lt;br /&gt;
        &lt;br /&gt;
        positions = [tuple(map(int, fin.readline().strip().split())) for _ in range(k)]&lt;br /&gt;
        &lt;br /&gt;
        restriction_error = check_restrictions(n, m, k, c1, c2, positions)&lt;br /&gt;
        if restriction_error:&lt;br /&gt;
            fout.write(restriction_error)&lt;br /&gt;
        else:&lt;br /&gt;
            a = [[0] * 1001 for _ in range(1001)]&lt;br /&gt;
            b = [[0] * 1001 for _ in range(1001)]&lt;br /&gt;
            q = deque()&lt;br /&gt;
            &lt;br /&gt;
            lee(c1, c2, n, m, b, q)&lt;br /&gt;
            &lt;br /&gt;
            mini = float(&#039;inf&#039;)&lt;br /&gt;
            maxi = 0&lt;br /&gt;
            &lt;br /&gt;
            for x, y in positions:&lt;br /&gt;
                if b[x][y] &amp;lt; mini:&lt;br /&gt;
                    mini = b[x][y]&lt;br /&gt;
                if b[x][y] &amp;gt; maxi:&lt;br /&gt;
                    maxi = b[x][y]&lt;br /&gt;
            &lt;br /&gt;
            if op == 1:&lt;br /&gt;
                fout.write(str(mini - 1))&lt;br /&gt;
            else:&lt;br /&gt;
                fout.write(str(maxi - 1))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4013_-_CMGB&amp;diff=9139</id>
		<title>4013 - CMGB</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4013_-_CMGB&amp;diff=9139"/>
		<updated>2024-01-06T20:22:14Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == Cunoscutul programator Văndămel are la dispoziție o matrice binară cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii (numerotate 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 &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane (numerotate 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;). Văndămel poate efectua, de câte ori e posibil, următoarea operație: alege două poziții vecine pe linie sau pe coloană și care conțin ambele valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și le transformă în &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. De exemplu, în matricea:...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Cunoscutul programator Văndămel are la dispoziție o matrice binară cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii (numerotate 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 &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; coloane (numerotate 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;). Văndămel poate efectua, de câte ori e posibil, următoarea operație: alege două poziții vecine pe linie sau pe coloană și care conțin ambele valoarea &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și le transformă în &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. De exemplu, în matricea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 1 1 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 1 0 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 0 0 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 1 1 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
el poate alege valorile de &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; de la pozițiile vecine &amp;lt;code&amp;gt;(1,2)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(2,2)&amp;lt;/code&amp;gt;, le transformă în &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; și obține matricea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 0 1 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 0 0 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;1 0 0 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0 1 1 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Văndămel știe să rezolve orice problemă, dar vrea să vadă dacă știți și voi să aflați numărul maxim posibil de operații care se pot efectua pe matricea dată.&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; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; și de pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii câte &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; numere binare reprezentând valorile din matrice.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran un singur număr natural reprezentând numărul maxim posibil de operații care se pot aplica asupra matricei.Î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, m ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 4 4&lt;br /&gt;
 0 1 1 0&lt;br /&gt;
 1 1 0 0&lt;br /&gt;
 1 0 0 0&lt;br /&gt;
 0 1 1 0&lt;br /&gt;
Ieșire&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Se efectuează operațiile la &amp;lt;code&amp;gt;(2,1)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(3,1)&amp;lt;/code&amp;gt;, la &amp;lt;code&amp;gt;(1,2)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(2,2)&amp;lt;/code&amp;gt; și la &amp;lt;code&amp;gt;(4,2)&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;(4,3)&amp;lt;/code&amp;gt;. După efectuarea celor &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; operații matricea arată astfel:&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 101 101&lt;br /&gt;
Ieșire&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;
Nmax = 100001&lt;br /&gt;
&lt;br /&gt;
oo = 1 &amp;lt;&amp;lt; 28&lt;br /&gt;
VI = list[int]&lt;br /&gt;
&lt;br /&gt;
n, m, p, v, im = 0, 0, 0, 0, 0&lt;br /&gt;
M = [[0]*202 for _ in range(202)]&lt;br /&gt;
A = [[0]*202 for _ in range(202)]&lt;br /&gt;
U = [0]*10001&lt;br /&gt;
D = [0]*10001&lt;br /&gt;
Vis = [False] * Nmax&lt;br /&gt;
V = [[] for _ in range(Nmax)]&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, m):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not (1 &amp;lt;= m &amp;lt;= 100):&lt;br /&gt;
        print(&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 cupleaza(v):&lt;br /&gt;
    if Vis[v]:&lt;br /&gt;
        return 0&lt;br /&gt;
&lt;br /&gt;
    Vis[v] = 1&lt;br /&gt;
&lt;br /&gt;
    for x in V[v]:&lt;br /&gt;
        if not D[x]:&lt;br /&gt;
            U[v] = x&lt;br /&gt;
            D[x] = v&lt;br /&gt;
            return True&lt;br /&gt;
    &lt;br /&gt;
    for x in V[v]:&lt;br /&gt;
        if cupleaza(D[x]):&lt;br /&gt;
            U[v] = x&lt;br /&gt;
            D[x] = v&lt;br /&gt;
            return True&lt;br /&gt;
&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global n, m, p, v, im, M, A, U, D, Vis, V&lt;br /&gt;
&lt;br /&gt;
    n, m = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
    if not check_constraints(n, m):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        row = list(map(int, input().split()))&lt;br /&gt;
        for j in range(1, m + 1):&lt;br /&gt;
            M[i][j] = row[j - 1]&lt;br /&gt;
&lt;br /&gt;
            if M[i][j] == 1:&lt;br /&gt;
                if (i + j) % 2 == 0:&lt;br /&gt;
                    p += 1&lt;br /&gt;
                    A[i][j] = p&lt;br /&gt;
                else:&lt;br /&gt;
                    im += 1&lt;br /&gt;
                    A[i][j] = im&lt;br /&gt;
            &lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(1, m + 1):&lt;br /&gt;
            if M[i][j] == 1 and (i + j) % 2 == 0:&lt;br /&gt;
                if M[i + 1][j]: V[A[i][j]].append(A[i + 1][j])&lt;br /&gt;
                if M[i][j + 1]: V[A[i][j]].append(A[i][j + 1])&lt;br /&gt;
                if M[i - 1][j]: V[A[i][j]].append(A[i - 1][j])&lt;br /&gt;
                if M[i][j - 1]: V[A[i][j]].append(A[i][j - 1])&lt;br /&gt;
    &lt;br /&gt;
    done = 0&lt;br /&gt;
    ans = 0&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        done = 1&lt;br /&gt;
&lt;br /&gt;
        for i in range(p + 1):&lt;br /&gt;
            Vis[i] = 0&lt;br /&gt;
        &lt;br /&gt;
        for i in range(1, p + 1):&lt;br /&gt;
            if U[i] == 0 and cupleaza(i):&lt;br /&gt;
                ans += 1&lt;br /&gt;
                done = 0&lt;br /&gt;
&lt;br /&gt;
    print(ans)&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1601_-_Ascensiune&amp;diff=9138</id>
		<title>1601 - Ascensiune</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1601_-_Ascensiune&amp;diff=9138"/>
		<updated>2024-01-06T20:07:10Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Înainte de a participa la Olimpiada Naționala de Informatică, Zoli s-a decis să se plimbe prin oraș. Orașul în care locuiește Zoli are forma unui arbore, fiecare nod reprezentând o locuință iar deplasarea între acestea se efectuează prin intermediul muchiilor.  Zoli dorește să determine lungimea maximă dintre oricare două locuințe din orașul său.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;ascensiuneIN.txt&amp;lt;/code&amp;gt; conține pe prima linie nu...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Înainte de a participa la Olimpiada Naționala de Informatică, Zoli s-a decis să se plimbe prin oraș. Orașul în care locuiește Zoli are forma unui arbore, fiecare nod reprezentând o locuință iar deplasarea între acestea se efectuează prin intermediul muchiilor.&lt;br /&gt;
&lt;br /&gt;
Zoli dorește să determine lungimea maximă dintre oricare două locuințe din orașul său.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;ascensiuneIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, numărul de locuințe, iar pe următoarele &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; linii câte două numere naturale &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; separate prin spații, reprezentând posibilitatea de deplasare bidirecțională între două locuințe.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;ascensiuneOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie un număr natural, reprezentând lungimea dintre cele mai îndepărtate locuințe din oraș.Î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 ≤ 100000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru 40% dintre teste, &amp;lt;code&amp;gt;1 ≤ n ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Distanța dintre două locuințe reprezintă numărul minim de locuințe intermediare prin care se poate ajunge de la una la cealaltă, inclusiv locuințele inițiale.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;ascensiuneIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 8&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 2 4&lt;br /&gt;
 2 5&lt;br /&gt;
 3 6&lt;br /&gt;
 3 7&lt;br /&gt;
 5 8&lt;br /&gt;
&amp;lt;code&amp;gt;ascensiuneOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Cele mai îndepărtate două locuințe sunt cele cu numărul de ordine 8, respectiv 6 sau 7. Distanța dintre acestea este de 6 locuințe.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;ascensiuneIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1000001&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 2 4&lt;br /&gt;
 2 5&lt;br /&gt;
 3 6&lt;br /&gt;
 3 7&lt;br /&gt;
 5 8&lt;br /&gt;
&amp;lt;code&amp;gt;ascensiuneOUT.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;
class TreeDiameter:&lt;br /&gt;
    def __init__(self, n):&lt;br /&gt;
        self.n = n&lt;br /&gt;
        self.G = [[] for _ in range(n + 1)]&lt;br /&gt;
        self.dist = [0] * (n + 1)&lt;br /&gt;
        self.viz = [False] * (n + 1)&lt;br /&gt;
        self.nod_max = 0&lt;br /&gt;
        self.dmax = 0&lt;br /&gt;
&lt;br /&gt;
    def dfs(self, i):&lt;br /&gt;
        self.viz[i] = True&lt;br /&gt;
        for p in self.G[i]:&lt;br /&gt;
            if not self.viz[p]:&lt;br /&gt;
                self.dist[p] = self.dist[i] + 1&lt;br /&gt;
                if self.dist[p] &amp;gt; self.dmax:&lt;br /&gt;
                    self.dmax = self.dist[p]&lt;br /&gt;
                    self.nod_max = p&lt;br /&gt;
                self.dfs(p)&lt;br /&gt;
&lt;br /&gt;
    def find_diameter(self):&lt;br /&gt;
        for i in range(1, self.n):&lt;br /&gt;
            x, y = map(int, input_file.readline().split())&lt;br /&gt;
            self.G[x].append(y)&lt;br /&gt;
            self.G[y].append(x)&lt;br /&gt;
&lt;br /&gt;
        self.dist[1] = 1&lt;br /&gt;
        self.dfs(1)&lt;br /&gt;
&lt;br /&gt;
        for i in range(1, self.n + 1):&lt;br /&gt;
            self.dist[i] = 0&lt;br /&gt;
            self.viz[i] = False&lt;br /&gt;
&lt;br /&gt;
        self.dist[self.nod_max] = 1&lt;br /&gt;
        self.dmax = 0&lt;br /&gt;
&lt;br /&gt;
        self.dfs(self.nod_max)&lt;br /&gt;
&lt;br /&gt;
        return self.dmax&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n):&lt;br /&gt;
    if 1 &amp;lt;= n &amp;lt;= 100000:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        with open(&amp;quot;ascensiuneOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as os:&lt;br /&gt;
            os.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;ascensiuneIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as input_file:&lt;br /&gt;
        n = int(input_file.readline())&lt;br /&gt;
&lt;br /&gt;
        if not check_constraints(n):&lt;br /&gt;
            # Exit if constraints are not met&lt;br /&gt;
            exit()&lt;br /&gt;
&lt;br /&gt;
        tree_diameter = TreeDiameter(n)&lt;br /&gt;
        result = tree_diameter.find_diameter()&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;ascensiuneOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as os:&lt;br /&gt;
        os.write(str(result))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2888_-_Spanning_Tree&amp;diff=9137</id>
		<title>2888 - Spanning Tree</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2888_-_Spanning_Tree&amp;diff=9137"/>
		<updated>2024-01-06T19:55:04Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Se consideră un graf neorientat conex cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; muchii.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se determine numărul arborilor parțiali ai grafului.&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; perechi de numere naturale &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt; reprezentând cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; muchii.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul arborilor parțiali ai grafului.Î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 ≤ 30.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; muchii sunt distincte două câte două&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 7&lt;br /&gt;
 1 4&lt;br /&gt;
 1 5&lt;br /&gt;
 2 3&lt;br /&gt;
 2 4&lt;br /&gt;
 4 5&lt;br /&gt;
 4 6&lt;br /&gt;
 4 7&lt;br /&gt;
Ieșire&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 30001&lt;br /&gt;
Ieșire&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 deque&lt;br /&gt;
&lt;br /&gt;
def check_restriction_n(value):&lt;br /&gt;
    if not (1 &amp;lt;= value &amp;lt;= 30000):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    check_restriction_n(n)&lt;br /&gt;
&lt;br /&gt;
    v = [[] for _ in range(30001)]&lt;br /&gt;
    t = [0] * 30001&lt;br /&gt;
    cnt = 0&lt;br /&gt;
    q = deque()&lt;br /&gt;
&lt;br /&gt;
    for _ in range(n):&lt;br /&gt;
        x, y = map(int, input().split())&lt;br /&gt;
        v[x].append(y)&lt;br /&gt;
        v[y].append(x)&lt;br /&gt;
        t[x] += 1&lt;br /&gt;
        t[y] += 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if t[i] == 1:&lt;br /&gt;
            q.append(i)&lt;br /&gt;
&lt;br /&gt;
    while q:&lt;br /&gt;
        x = q.popleft()&lt;br /&gt;
        for y in v[x]:&lt;br /&gt;
            if t[y]:&lt;br /&gt;
                t[y] -= 1&lt;br /&gt;
                if t[y] == 1:&lt;br /&gt;
                    q.append(y)&lt;br /&gt;
        t[x] = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if t[i] == 2:&lt;br /&gt;
            cnt += 1&lt;br /&gt;
&lt;br /&gt;
    print(cnt)&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2888_-_Spanning_Tree&amp;diff=9136</id>
		<title>2888 - Spanning Tree</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2888_-_Spanning_Tree&amp;diff=9136"/>
		<updated>2024-01-06T19:54:54Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == Se consideră un graf neorientat conex cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; muchii.  = Cerința = Să se determine numărul arborilor parțiali ai grafului.  = 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; perechi de numere naturale &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt; reprezentând cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; muchii.  = Date de ieșire = Programul va afișa pe ecran numărul arborilor parțiali ai grafului.  = Restricții și...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Se consideră un graf neorientat conex cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; muchii.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se determine numărul arborilor parțiali ai grafului.&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; perechi de numere naturale &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt; reprezentând cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; muchii.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul arborilor parțiali ai grafului.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 30.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; muchii sunt distincte două câte două&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 7&lt;br /&gt;
 1 4&lt;br /&gt;
 1 5&lt;br /&gt;
 2 3&lt;br /&gt;
 2 4&lt;br /&gt;
 4 5&lt;br /&gt;
 4 6&lt;br /&gt;
 4 7&lt;br /&gt;
Ieșire&lt;br /&gt;
 3&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 30001&lt;br /&gt;
Ieșire&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 deque&lt;br /&gt;
&lt;br /&gt;
def check_restriction_n(value):&lt;br /&gt;
    if not (1 &amp;lt;= value &amp;lt;= 30000):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input())&lt;br /&gt;
    check_restriction_n(n)&lt;br /&gt;
&lt;br /&gt;
    v = [[] for _ in range(30001)]&lt;br /&gt;
    t = [0] * 30001&lt;br /&gt;
    cnt = 0&lt;br /&gt;
    q = deque()&lt;br /&gt;
&lt;br /&gt;
    for _ in range(n):&lt;br /&gt;
        x, y = map(int, input().split())&lt;br /&gt;
        v[x].append(y)&lt;br /&gt;
        v[y].append(x)&lt;br /&gt;
        t[x] += 1&lt;br /&gt;
        t[y] += 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if t[i] == 1:&lt;br /&gt;
            q.append(i)&lt;br /&gt;
&lt;br /&gt;
    while q:&lt;br /&gt;
        x = q.popleft()&lt;br /&gt;
        for y in v[x]:&lt;br /&gt;
            if t[y]:&lt;br /&gt;
                t[y] -= 1&lt;br /&gt;
                if t[y] == 1:&lt;br /&gt;
                    q.append(y)&lt;br /&gt;
        t[x] = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if t[i] == 2:&lt;br /&gt;
            cnt += 1&lt;br /&gt;
&lt;br /&gt;
    print(cnt)&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4078_-_Distanta&amp;diff=9135</id>
		<title>4078 - Distanta</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4078_-_Distanta&amp;diff=9135"/>
		<updated>2024-01-06T19:49:40Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Matei, care locuiește in orașul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, vrea să ajungă in orașul &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; să il viziteze. El are o hartă pe care se află &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; orașe și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; drumuri prin care poate să treacă pentru a ajunge la destinație. Pe hartă apare și durata de timp &amp;lt;code&amp;gt;td&amp;lt;/code&amp;gt; pentru fiecare drum, care reprezintă numărul de minute în care este parcurs drumul și &amp;lt;code&amp;gt;to&amp;lt;/code&amp;gt; pentru traversarea orașelor (unele orașe sunt mai aglome...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Matei, care locuiește in orașul &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, vrea să ajungă in orașul &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; să il viziteze. El are o hartă pe care se află &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; orașe și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; drumuri prin care poate să treacă pentru a ajunge la destinație. Pe hartă apare și durata de timp &amp;lt;code&amp;gt;td&amp;lt;/code&amp;gt; pentru fiecare drum, care reprezintă numărul de minute în care este parcurs drumul și &amp;lt;code&amp;gt;to&amp;lt;/code&amp;gt; pentru traversarea orașelor (unele orașe sunt mai aglomerate, iar altele nu). Matei vrea să ajungă cat mai rapid la destinație, dar dacă există mai multe trasee de timp minim, il va alege pe acela care trece prin mai multe orașe. Nu vor exista trasee de timp minim cu același număr de orașe. Ajutati-l pe Matei să gasească drumul cerut.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;distantaIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; linii se citesc &amp;lt;code&amp;gt;nume oraș&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;to&amp;lt;/code&amp;gt; al acestuia. Se citește &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;td&amp;lt;/code&amp;gt; unde &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; reprezintă orașele care sunt legate prin drumul care se parcurge în &amp;lt;code&amp;gt;td&amp;lt;/code&amp;gt;. Pe ultima linie se citesc &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&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;distantaOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;, reprezentând durata de timp în care se parcurge traseul cerut, iar pe următoarele linii se afișează traseul. Dacă nu există nici un traseu se va afișa &amp;lt;code&amp;gt;NU EXISTA TRASEU&amp;lt;/code&amp;gt;.Î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 &amp;lt; n &amp;lt; 21&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ m ≤ 190&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 &amp;lt; numele orașelor (număr caractere) &amp;lt; 21&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ numărul de drumuri dintre oricare 2 orașe ≤ 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;0 ≤ S ≤ 2.000.000.001&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nu există drum de la un oraș la el însuși&lt;br /&gt;
* Dacă nu există nici un traseu se va afișa &amp;lt;code&amp;gt;NU EXISTA TRASEU&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;distantaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 &lt;br /&gt;
 Bistrita 14&lt;br /&gt;
 Oradea 80&lt;br /&gt;
 Beius 7&lt;br /&gt;
 Galatii-Bistritei 1&lt;br /&gt;
 Reghin 3&lt;br /&gt;
 Sibiu 15&lt;br /&gt;
 Cluj-Napoca 30&lt;br /&gt;
 10&lt;br /&gt;
 Bistrita Oradea 223&lt;br /&gt;
 Cluj-Napoca Sibiu 119&lt;br /&gt;
 Bistrita Cluj-Napoca 100&lt;br /&gt;
 Beius Oradea 50&lt;br /&gt;
 Bistrita Galatii-Bistritei 15&lt;br /&gt;
 Reghin Galatii-Bistritei 35&lt;br /&gt;
 Oradea Cluj-Napoca 100&lt;br /&gt;
 Sibiu Reghin 154&lt;br /&gt;
 Beius Sibiu 130&lt;br /&gt;
 Reghin Cluj-Napoca 133&lt;br /&gt;
 Bistrita Beius&lt;br /&gt;
&amp;lt;code&amp;gt;distantaOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 374&lt;br /&gt;
 Bistrita&lt;br /&gt;
 Galatii-Bistritei&lt;br /&gt;
 Reghin&lt;br /&gt;
 Sibiu&lt;br /&gt;
 Beius&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;distantaIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 22&lt;br /&gt;
 Bistrita 14&lt;br /&gt;
 Oradea 80&lt;br /&gt;
 Beius 7&lt;br /&gt;
 Galatii-Bistritei 1&lt;br /&gt;
 Reghin 3&lt;br /&gt;
 Sibiu 15&lt;br /&gt;
 Cluj-Napoca 30&lt;br /&gt;
 10&lt;br /&gt;
 Bistrita Oradea 223&lt;br /&gt;
 Cluj-Napoca Sibiu 119&lt;br /&gt;
 Bistrita Cluj-Napoca 100&lt;br /&gt;
 Beius Oradea 50&lt;br /&gt;
 Bistrita Galatii-Bistritei 15&lt;br /&gt;
 Reghin Galatii-Bistritei 35&lt;br /&gt;
 Oradea Cluj-Napoca 100&lt;br /&gt;
 Sibiu Reghin 154&lt;br /&gt;
 Beius Sibiu 130&lt;br /&gt;
 Reghin Cluj-Napoca 133&lt;br /&gt;
 Bistrita Beius&lt;br /&gt;
&amp;lt;code&amp;gt;distantaOUT.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 queue import Queue&lt;br /&gt;
&lt;br /&gt;
Inf = 0x3f3f3f3f&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, m, codif):&lt;br /&gt;
    if not (1 &amp;lt; n &amp;lt; 21) or not (0 &amp;lt;= m &amp;lt;= 190):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for _, _, s in codif:&lt;br /&gt;
        if not (0 &amp;lt; len(s) &amp;lt; 21):&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;distantaIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as infile, open(&amp;quot;distantaOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
        n = int(infile.readline().strip())&lt;br /&gt;
        codif = []&lt;br /&gt;
        G = [[] for _ in range(51)]&lt;br /&gt;
        t = [0] * 51&lt;br /&gt;
        timp = [0] * 51&lt;br /&gt;
&lt;br /&gt;
        if not (1 &amp;lt; n &amp;lt; 21):&lt;br /&gt;
            outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                line = infile.readline().split()&lt;br /&gt;
                if len(line) != 2:&lt;br /&gt;
                    outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                s, cost = line&lt;br /&gt;
                cost = int(cost)&lt;br /&gt;
                codif.append((i, cost, s))&lt;br /&gt;
&lt;br /&gt;
            m = int(infile.readline().strip())&lt;br /&gt;
&lt;br /&gt;
            if not (0 &amp;lt;= m &amp;lt;= 190):&lt;br /&gt;
                outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                for i in range(1, m + 1):&lt;br /&gt;
                    line = infile.readline().split()&lt;br /&gt;
                    if len(line) != 3:&lt;br /&gt;
                        outfile.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                    unu, doi, cost = line&lt;br /&gt;
                    cost = int(cost)&lt;br /&gt;
                    x = next(item[0] for item in codif if item[2] == unu)&lt;br /&gt;
                    y = next(item[0] for item in codif if item[2] == doi)&lt;br /&gt;
                    G[x].append((y, cost))&lt;br /&gt;
                    G[y].append((x, cost))&lt;br /&gt;
&lt;br /&gt;
                unu, doi = infile.readline().split()&lt;br /&gt;
                start_node = next(item[0] for item in codif if item[2] == doi)&lt;br /&gt;
&lt;br /&gt;
                def decodif(oras):&lt;br /&gt;
                    for x, y, s in codif:&lt;br /&gt;
                        if s == oras:&lt;br /&gt;
                            return x&lt;br /&gt;
&lt;br /&gt;
                def costnod(nod):&lt;br /&gt;
                    for x, y, s in codif:&lt;br /&gt;
                        if nod == x:&lt;br /&gt;
                            return y&lt;br /&gt;
&lt;br /&gt;
                def afisare(nod):&lt;br /&gt;
                    for x, y, s in codif:&lt;br /&gt;
                        if nod == x:&lt;br /&gt;
                            return s&lt;br /&gt;
&lt;br /&gt;
                def bfs(nod):&lt;br /&gt;
                    t[nod] = nod&lt;br /&gt;
                    timp[nod] = costnod(nod)&lt;br /&gt;
                    q = Queue()&lt;br /&gt;
                    q.put(nod)&lt;br /&gt;
&lt;br /&gt;
                    while not q.empty():&lt;br /&gt;
                        x = q.get()&lt;br /&gt;
&lt;br /&gt;
                        for i, c in G[x]:&lt;br /&gt;
                            costnou = timp[x] + c + costnod(i)&lt;br /&gt;
&lt;br /&gt;
                            if not timp[i] or costnou &amp;lt;= timp[i]:&lt;br /&gt;
                                timp[i] = costnou&lt;br /&gt;
                                t[i] = x&lt;br /&gt;
                                q.put(i)&lt;br /&gt;
&lt;br /&gt;
                bfs(start_node)&lt;br /&gt;
&lt;br /&gt;
                if timp[decodif(unu)] != 0:&lt;br /&gt;
                    outfile.write(str(timp[decodif(unu)]) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
                    plec = decodif(unu)&lt;br /&gt;
                    while plec != t[plec]:&lt;br /&gt;
                        outfile.write(afisare(plec) + &#039;\n&#039;)&lt;br /&gt;
                        plec = t[plec]&lt;br /&gt;
&lt;br /&gt;
                    outfile.write(afisare(decodif(doi)))&lt;br /&gt;
                else:&lt;br /&gt;
                    outfile.write(&amp;quot;NU EXISTA TRASEU&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4304_-_FF&amp;diff=9134</id>
		<title>4304 - FF</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4304_-_FF&amp;diff=9134"/>
		<updated>2024-01-06T19:40:44Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Se dă un graf neorientat. Să se determine un subgraf al său, cu număr cât mai mare de noduri și în care fiecare nod are gradul cel puțin &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;ffIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; reprezentând numărul de noduri și numărul de muchii pentru graful dat. Fiecare din următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține două numere, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/cod...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un graf neorientat. Să se determine un subgraf al său, cu număr cât mai mare de noduri și în care fiecare nod are gradul cel puțin &amp;lt;code&amp;gt;2&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;ffIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; reprezentând numărul de noduri și numărul de muchii pentru graful dat. Fiecare din următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține două numere, &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;, semnificând existența în graful dat a unei muchii între nodurile &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &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;ffOUT.txt&amp;lt;/code&amp;gt; va conține valoarea ce reprezintă numărul maxim de noduri pe care le poate avea subgraful determinat.Î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 ≤ 100.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ m ≤ 200.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se garantează existența unui astfel de subgraf.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;ffIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 4 4&lt;br /&gt;
 1 2&lt;br /&gt;
 4 1&lt;br /&gt;
 2 3&lt;br /&gt;
 1 3&lt;br /&gt;
&amp;lt;code&amp;gt;ffOUT.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;ffIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 123921321 4&lt;br /&gt;
 1 2&lt;br /&gt;
 4 1&lt;br /&gt;
 2 3&lt;br /&gt;
 1 3&lt;br /&gt;
&amp;lt;code&amp;gt;ffOUT.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 deque&lt;br /&gt;
&lt;br /&gt;
Inf = 0x3f3f3f3f&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, m):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100000 and 1 &amp;lt;= m &amp;lt;= 200000):&lt;br /&gt;
        with open(&amp;quot;ffOUT.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 True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;ffIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as infile, open(&amp;quot;ffOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as outfile:&lt;br /&gt;
        n, m = map(int, infile.readline().split())&lt;br /&gt;
        &lt;br /&gt;
        if check_restrictions(n, m):&lt;br /&gt;
            return&lt;br /&gt;
        &lt;br /&gt;
        G = [[] for _ in range(n + 1)]&lt;br /&gt;
        g = [0] * (n + 1)&lt;br /&gt;
        f = [0] * (n + 1)&lt;br /&gt;
        scad = 0&lt;br /&gt;
&lt;br /&gt;
        for _ in range(m):&lt;br /&gt;
            x, y = map(int, infile.readline().split())&lt;br /&gt;
            G[x].append(y)&lt;br /&gt;
            G[y].append(x)&lt;br /&gt;
            g[x] += 1&lt;br /&gt;
            g[y] += 1&lt;br /&gt;
&lt;br /&gt;
        q = deque()&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            if g[i] == 1:&lt;br /&gt;
                q.append(i)&lt;br /&gt;
                g[i] = 0&lt;br /&gt;
                f[i] = 1&lt;br /&gt;
            elif g[i] == 0:&lt;br /&gt;
                scad += 1&lt;br /&gt;
&lt;br /&gt;
        while q:&lt;br /&gt;
            x = q.popleft()&lt;br /&gt;
            scad += 1&lt;br /&gt;
            for i in G[x]:&lt;br /&gt;
                g[i] -= 1&lt;br /&gt;
&lt;br /&gt;
                if g[i] &amp;lt; 2 and f[i] == 0:&lt;br /&gt;
                    q.append(i)&lt;br /&gt;
                    f[i] = 1&lt;br /&gt;
&lt;br /&gt;
        outfile.write(str(n - scad))&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0544_-_Partial&amp;diff=9133</id>
		<title>0544 - Partial</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0544_-_Partial&amp;diff=9133"/>
		<updated>2024-01-06T19:34:55Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un graf neorientat conex cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și număr par de muchii. Să se determine un graf parțial al celui dat care să fie conex și să fie obținut prin eliminarea a jumătate din numărul de muchii.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;partialIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a următoarele linii perechi de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există muchie de la &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;j&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;partialOUT.txt&amp;lt;/code&amp;gt; va conține matricea de adiacență a grafului parțial obținut, câte o linie a matricei pe o linie a fișierului, elementele fiecărei linii fiind separate prin exact un spațiu.Î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 ≤ 200&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ i,j ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* se garantează existența unui graf parțial cu proprietatea cerută&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;partialIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 4&lt;br /&gt;
 1 5&lt;br /&gt;
 1 6&lt;br /&gt;
 2 4&lt;br /&gt;
 2 5&lt;br /&gt;
 3 4&lt;br /&gt;
 3 5&lt;br /&gt;
 4 5&lt;br /&gt;
 4 6&lt;br /&gt;
 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;partialOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 1 0 0 0 0 &lt;br /&gt;
 1 0 0 1 0 0 &lt;br /&gt;
 0 0 0 1 1 0 &lt;br /&gt;
 0 1 1 0 0 1 &lt;br /&gt;
 0 0 1 0 0 1 &lt;br /&gt;
 0 0 0 1 1 0 &lt;br /&gt;
&lt;br /&gt;
= Observații =&lt;br /&gt;
&lt;br /&gt;
* 2016, iunie 02: am adăugat un test cu o situație care nu era cuprinsă în testele anterioare.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;partialIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 201&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 4&lt;br /&gt;
 1 5&lt;br /&gt;
 1 6&lt;br /&gt;
 2 4&lt;br /&gt;
 2 5&lt;br /&gt;
 3 4&lt;br /&gt;
 3 5&lt;br /&gt;
 4 5&lt;br /&gt;
 4 6&lt;br /&gt;
 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;partialOUT.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;
nMAX = 200&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, i, j):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= nMAX) or not (1 &amp;lt;= i &amp;lt;= n) or not (1 &amp;lt;= j &amp;lt;= n):&lt;br /&gt;
        with open(&amp;quot;partialOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.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(n, gf, viz, viznod):&lt;br /&gt;
    def dfs_util(nod):&lt;br /&gt;
        viznod[nod] = True&lt;br /&gt;
        for j in range(1, n + 1):&lt;br /&gt;
            if gf[nod][j] and not viznod[j]:&lt;br /&gt;
                viz[nod][j] = viz[j][nod] = True&lt;br /&gt;
                dfs_util(j)&lt;br /&gt;
&lt;br /&gt;
    dfs_util(1)&lt;br /&gt;
&lt;br /&gt;
def process_input():&lt;br /&gt;
    n, m = 0, 0&lt;br /&gt;
    gf = [[False] * (nMAX + 1) for _ in range(nMAX + 1)]&lt;br /&gt;
    viz = [[False] * (nMAX + 1) for _ in range(nMAX + 1)]&lt;br /&gt;
    viznod = [False] * (nMAX + 1)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;partialIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        if not check_constraints(n, 1, 1):&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        for line in fin:&lt;br /&gt;
            a, b = map(int, line.split())&lt;br /&gt;
            if not check_constraints(n, a, b):&lt;br /&gt;
                return&lt;br /&gt;
&lt;br /&gt;
            gf[a][b] = gf[b][a] = True&lt;br /&gt;
            m += 1&lt;br /&gt;
&lt;br /&gt;
    dfs(n, gf, viz, viznod)&lt;br /&gt;
&lt;br /&gt;
    mfol = 0&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(i + 1, n + 1):&lt;br /&gt;
            if mfol != m // 2 and gf[i][j] and not viz[i][j]:&lt;br /&gt;
                gf[i][j] = gf[j][i] = False&lt;br /&gt;
                mfol += 1&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;partialOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        if check_constraints(n, 1, 1):&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                fout.write(&#039; &#039;.join(map(str, [int(x) for x in gf[i][1:n + 1]])) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    process_input()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0544_-_Partial&amp;diff=9132</id>
		<title>0544 - Partial</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0544_-_Partial&amp;diff=9132"/>
		<updated>2024-01-06T19:34:43Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Se dă un graf neorientat conex cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și număr par de muchii. Să se determine un graf parțial al celui dat care să fie conex și să fie obținut prin eliminarea a jumătate din numărul de muchii.  = Date de intrare = Fișierul de intrare &amp;lt;code&amp;gt;partialIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a următoarele linii perechi de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există muchie de la &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; la &amp;lt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă un graf neorientat conex cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și număr par de muchii. Să se determine un graf parțial al celui dat care să fie conex și să fie obținut prin eliminarea a jumătate din numărul de muchii.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;partialIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, iar pe a următoarele linii perechi de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există muchie de la &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;j&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;partialOUT.txt&amp;lt;/code&amp;gt; va conține matricea de adiacență a grafului parțial obținut, câte o linie a matricei pe o linie a fișierului, elementele fiecărei linii 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 ≤ n ≤ 200&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ i,j ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* se garantează existența unui graf parțial cu proprietatea cerută&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;partialIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 4&lt;br /&gt;
 1 5&lt;br /&gt;
 1 6&lt;br /&gt;
 2 4&lt;br /&gt;
 2 5&lt;br /&gt;
 3 4&lt;br /&gt;
 3 5&lt;br /&gt;
 4 5&lt;br /&gt;
 4 6&lt;br /&gt;
 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;partialOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0 1 0 0 0 0 &lt;br /&gt;
 1 0 0 1 0 0 &lt;br /&gt;
 0 0 0 1 1 0 &lt;br /&gt;
 0 1 1 0 0 1 &lt;br /&gt;
 0 0 1 0 0 1 &lt;br /&gt;
 0 0 0 1 1 0 &lt;br /&gt;
&lt;br /&gt;
= Observații =&lt;br /&gt;
&lt;br /&gt;
* 2016, iunie 02: am adăugat un test cu o situație care nu era cuprinsă în testele anterioare.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;partialIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 201&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 4&lt;br /&gt;
 1 5&lt;br /&gt;
 1 6&lt;br /&gt;
 2 4&lt;br /&gt;
 2 5&lt;br /&gt;
 3 4&lt;br /&gt;
 3 5&lt;br /&gt;
 4 5&lt;br /&gt;
 4 6&lt;br /&gt;
 5 6&lt;br /&gt;
&amp;lt;code&amp;gt;partialOUT.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;
nMAX = 200&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, i, j):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= nMAX) or not (1 &amp;lt;= i &amp;lt;= n) or not (1 &amp;lt;= j &amp;lt;= n):&lt;br /&gt;
        with open(&amp;quot;partialOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.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(n, gf, viz, viznod):&lt;br /&gt;
    def dfs_util(nod):&lt;br /&gt;
        viznod[nod] = True&lt;br /&gt;
        for j in range(1, n + 1):&lt;br /&gt;
            if gf[nod][j] and not viznod[j]:&lt;br /&gt;
                viz[nod][j] = viz[j][nod] = True&lt;br /&gt;
                dfs_util(j)&lt;br /&gt;
&lt;br /&gt;
    dfs_util(1)&lt;br /&gt;
&lt;br /&gt;
def process_input():&lt;br /&gt;
    n, m = 0, 0&lt;br /&gt;
    gf = [[False] * (nMAX + 1) for _ in range(nMAX + 1)]&lt;br /&gt;
    viz = [[False] * (nMAX + 1) for _ in range(nMAX + 1)]&lt;br /&gt;
    viznod = [False] * (nMAX + 1)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;partialIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        if not check_constraints(n, 1, 1):&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        for line in fin:&lt;br /&gt;
            a, b = map(int, line.split())&lt;br /&gt;
            if not check_constraints(n, a, b):&lt;br /&gt;
                return&lt;br /&gt;
&lt;br /&gt;
            gf[a][b] = gf[b][a] = True&lt;br /&gt;
            m += 1&lt;br /&gt;
&lt;br /&gt;
    dfs(n, gf, viz, viznod)&lt;br /&gt;
&lt;br /&gt;
    mfol = 0&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        for j in range(i + 1, n + 1):&lt;br /&gt;
            if mfol != m // 2 and gf[i][j] and not viz[i][j]:&lt;br /&gt;
                gf[i][j] = gf[j][i] = False&lt;br /&gt;
                mfol += 1&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;partialOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        if check_constraints(n, 1, 1):&lt;br /&gt;
            for i in range(1, n + 1):&lt;br /&gt;
                fout.write(&#039; &#039;.join(map(str, [int(x) for x in gf[i][1:n + 1]])) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    process_input()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4064_-_Ghiocel&amp;diff=9131</id>
		<title>4064 - Ghiocel</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4064_-_Ghiocel&amp;diff=9131"/>
		<updated>2024-01-06T19:27:07Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Într-un oraș sunt &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; case numerotate 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;. Între anumite case sunt străzi bidirecționale. În casa cu numărul &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; locuiește Ghiocel. El are &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; colege ale căror numere de casă îi sunt cunoscute și Ghiocel dorește să le ducă ghiocei la inceputul lunii martie. Pentru că este leneș, Ghiocel se decide să ducă ghiocei colegei sau colegelor care stă (stau) la o casă până la care G...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Într-un oraș sunt &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; case numerotate 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;. Între anumite case sunt străzi bidirecționale. În casa cu numărul &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; locuiește Ghiocel. El are &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; colege ale căror numere de casă îi sunt cunoscute și Ghiocel dorește să le ducă ghiocei la inceputul lunii martie. Pentru că este leneș, Ghiocel se decide să ducă ghiocei colegei sau colegelor care stă (stau) la o casă până la care Ghiocel are de parcurs un număr minim de străzi. Ajutați-l pe Ghiocel să determine numerele acestor case.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;ghiocelIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n m g&amp;lt;/code&amp;gt;, reprezentând numărul de case, numărul de străzi și numărul casei în care locuiește Ghiocel. Urmează &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii cu câte două numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația: casele &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt; sunt legate printr-o stradă bidirecțională. Pe următoarea linie se află numărul &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; a colegelor lui Ghiocel, iar pe ultima linie se află &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; numere 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 numerele caselor unde locuiesc colegele lui Ghiocel.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;ghiocelOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie numerele caselor unde locuiesc colege de-ale lui Ghicel până la care acesta are de parcurs un număr minim de străzi. Numerele se vor afișa în ordine crescătoare și separate prin câte 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 ≤ m ≤ n * (n - 1) / 2&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ i, j ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;ghiocelIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 10 12 6&lt;br /&gt;
 1 2&lt;br /&gt;
 1 7&lt;br /&gt;
 1 10&lt;br /&gt;
 2 4&lt;br /&gt;
 2 5&lt;br /&gt;
 2 6&lt;br /&gt;
 3 4&lt;br /&gt;
 4 5&lt;br /&gt;
 5 6&lt;br /&gt;
 7 8&lt;br /&gt;
 8 10&lt;br /&gt;
 9 10&lt;br /&gt;
 4&lt;br /&gt;
 1 4 8 10&lt;br /&gt;
&amp;lt;code&amp;gt;ghiocelOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 4&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Ghiocel locuiește în casa cu numărul &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt;. Colegele lui stau în casele &amp;lt;code&amp;gt;1 4 8 10&amp;lt;/code&amp;gt;. Până la casele &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; ajunge mergând pe un număr minim de străzi.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
&amp;lt;code&amp;gt;ghiocelIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 101 12 6&lt;br /&gt;
 1 2&lt;br /&gt;
 1 7&lt;br /&gt;
 1 10&lt;br /&gt;
 2 4&lt;br /&gt;
 2 5&lt;br /&gt;
 2 6&lt;br /&gt;
 3 4&lt;br /&gt;
 4 5&lt;br /&gt;
 5 6&lt;br /&gt;
 7 8&lt;br /&gt;
 8 10&lt;br /&gt;
 9 10&lt;br /&gt;
 4&lt;br /&gt;
 1 4 8 10&lt;br /&gt;
&amp;lt;code&amp;gt;ghiocelOUT.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 deque&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, m, edges):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100) or not (1 &amp;lt;= m &amp;lt;= n * (n - 1) / 2):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for a, b in edges:&lt;br /&gt;
        if not (1 &amp;lt;= a &amp;lt;= n) or not (1 &amp;lt;= b &amp;lt;= n):&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def BFS(start):&lt;br /&gt;
    q = deque([start])&lt;br /&gt;
&lt;br /&gt;
    while q:&lt;br /&gt;
        current = q.popleft()&lt;br /&gt;
&lt;br /&gt;
        for neighbor in vecini[current]:&lt;br /&gt;
            if not gasit[neighbor]:&lt;br /&gt;
                gasit[neighbor] = True&lt;br /&gt;
                q.append(neighbor)&lt;br /&gt;
                distanta[neighbor] = distanta[current] + 1&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global vecini, gasit, distanta&lt;br /&gt;
    with open(&amp;quot;ghiocelIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as file_in:&lt;br /&gt;
        n, m, start = map(int, file_in.readline().split())&lt;br /&gt;
&lt;br /&gt;
        edges = [tuple(map(int, file_in.readline().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
        if not check_constraints(n, m, edges):&lt;br /&gt;
            with open(&amp;quot;ghiocelOUT.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&lt;br /&gt;
&lt;br /&gt;
        vecini = {i: set() for i in range(1, n + 1)}&lt;br /&gt;
        gasit = [False] * (n + 1)&lt;br /&gt;
        distanta = [0] * (n + 1)&lt;br /&gt;
&lt;br /&gt;
        for a, b in edges:&lt;br /&gt;
            vecini[a].add(b)&lt;br /&gt;
            vecini[b].add(a)&lt;br /&gt;
&lt;br /&gt;
        BFS(start)&lt;br /&gt;
&lt;br /&gt;
        fete = int(file_in.readline())  # Read the number of girls from the file&lt;br /&gt;
        colege = set(map(int, file_in.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;ghiocelOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as file_out:&lt;br /&gt;
        mini = float(&#039;inf&#039;)&lt;br /&gt;
        for i in colege:&lt;br /&gt;
            mini = min(mini, distanta[i])&lt;br /&gt;
&lt;br /&gt;
        result = [i for i in colege if distanta[i] == mini]&lt;br /&gt;
        file_out.write(&amp;quot; &amp;quot;.join(map(str, result)))&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3235_-_Entries&amp;diff=9130</id>
		<title>3235 - Entries</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3235_-_Entries&amp;diff=9130"/>
		<updated>2024-01-06T19:18:10Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Se consideră un graf care inițial este format din &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; noduri izolate, etichetate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;. Se mai consideră &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; intrări, unde intrare poate însemna:&lt;br /&gt;
&lt;br /&gt;
* comandă – o comandă are forma &amp;lt;code&amp;gt;I + J&amp;lt;/code&amp;gt;, cu semnificația că în graf se adaugă muchia care unește nodurile &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; (dacă &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; erau deja unite în acel moment, nu se întreprinde nici o acțiune);&lt;br /&gt;
* întrebare – o întrebare este de forma &amp;lt;code&amp;gt;I ? J&amp;lt;/code&amp;gt;, adică se întreabă dacă în acel moment &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; sunt în aceeași componentă conexă.&lt;br /&gt;
&lt;br /&gt;
Se pleacă deci de la un graf inițial format din noduri izolate, care pe parcurs se “unifică”. Tot pe parcurs sunteți întrebat dacă anumite perechi de noduri sunt sau nu în aceeași componentă conexă.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program care să răspundă la întrebările din fișierul de intrare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Din fișierul &amp;lt;code&amp;gt;entriesIN.txt&amp;lt;/code&amp;gt; veți citi de pe prima linie numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; de intrări. Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se găsesc intrările, câte una pe linie. O intrare este codificată prin trei numere separate prin câte un blanc. Primele două numere reprezintă nodurile &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; (numere întregi, cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;), iar al treilea este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; dacă intrarea este o comandă, respectiv &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; dacă intrarea este o întrebare.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;entriesOUT.txt&amp;lt;/code&amp;gt; va conține răspunsurile la întrebări, câte un răspuns pe o linie, în ordinea din fișierul de intrare. Răspunsul va fi numărul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; dacă nodurile despre care ați fost întrebat sunt în acel moment în aceeași componentă conexă, respectiv numărul &amp;lt;code&amp;gt;0&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 ≤ 5 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ P ≤ 10.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;entriesIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 9&lt;br /&gt;
 1 2 2 &lt;br /&gt;
 1 2 1&lt;br /&gt;
 3 7 2&lt;br /&gt;
 2 3 1&lt;br /&gt;
 1 3 2&lt;br /&gt;
 2 4 2&lt;br /&gt;
 1 4 1&lt;br /&gt;
 3 4 2&lt;br /&gt;
 1 7 2&lt;br /&gt;
&amp;lt;code&amp;gt;entriesOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0&lt;br /&gt;
 0&lt;br /&gt;
 1&lt;br /&gt;
 0&lt;br /&gt;
 1&lt;br /&gt;
 0&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;entriesIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5001&lt;br /&gt;
 1 2 2 &lt;br /&gt;
 1 2 1&lt;br /&gt;
 3 7 2&lt;br /&gt;
 2 3 1&lt;br /&gt;
 1 3 2&lt;br /&gt;
 2 4 2&lt;br /&gt;
 1 4 1&lt;br /&gt;
 3 4 2&lt;br /&gt;
 1 7 2&lt;br /&gt;
&amp;lt;code&amp;gt;entriesOUT.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_restrictiile(n, p):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 5000):&lt;br /&gt;
        raise ValueError(&amp;quot;&amp;quot;)&lt;br /&gt;
    if not (1 &amp;lt;= p &amp;lt;= 10000000):&lt;br /&gt;
        raise ValueError(&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    fin = open(&amp;quot;entriesIN.txt&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
    fout = open(&amp;quot;entriesOUT.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    M = {}&lt;br /&gt;
    t = [0] * 10005&lt;br /&gt;
    n = 0&lt;br /&gt;
&lt;br /&gt;
    def find(x):&lt;br /&gt;
        z, y = x, x&lt;br /&gt;
        while t[x] != 0:&lt;br /&gt;
            x = t[x]&lt;br /&gt;
&lt;br /&gt;
        while t[y] != 0:&lt;br /&gt;
            z = t[y]&lt;br /&gt;
            t[y] = x&lt;br /&gt;
            y = z&lt;br /&gt;
&lt;br /&gt;
        return x&lt;br /&gt;
&lt;br /&gt;
    def union(x, y):&lt;br /&gt;
        t[y] = x&lt;br /&gt;
&lt;br /&gt;
    T = int(fin.readline().strip())&lt;br /&gt;
    try:&lt;br /&gt;
        verifica_restrictiile(T, T)  # Check restrictions for n (number of test cases)&lt;br /&gt;
    except ValueError as e:&lt;br /&gt;
        fout.write(f&amp;quot;Datele nu corespund restrictiilor impuse {str(e)}&amp;quot;)&lt;br /&gt;
        fin.close()&lt;br /&gt;
        fout.close()&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    for _ in range(T):&lt;br /&gt;
        x, y, op = map(int, fin.readline().strip().split())&lt;br /&gt;
        k = 0&lt;br /&gt;
        if x not in M:&lt;br /&gt;
            k = 1&lt;br /&gt;
            n += 1&lt;br /&gt;
            M[x] = n&lt;br /&gt;
        if y not in M:&lt;br /&gt;
            k = 1&lt;br /&gt;
            n += 1&lt;br /&gt;
            M[y] = n&lt;br /&gt;
&lt;br /&gt;
        x = M[x]&lt;br /&gt;
        y = M[y]&lt;br /&gt;
        x = find(x)&lt;br /&gt;
        y = find(y)&lt;br /&gt;
&lt;br /&gt;
        if op == 1:&lt;br /&gt;
            if x != y:&lt;br /&gt;
                union(x, y)&lt;br /&gt;
        else:&lt;br /&gt;
            if k == 1:&lt;br /&gt;
                fout.write(&amp;quot;0\n&amp;quot;)&lt;br /&gt;
            elif x == y:&lt;br /&gt;
                fout.write(&amp;quot;1\n&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                fout.write(&amp;quot;0\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    fin.close()&lt;br /&gt;
    fout.close()&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3235_-_Entries&amp;diff=9129</id>
		<title>3235 - Entries</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3235_-_Entries&amp;diff=9129"/>
		<updated>2024-01-06T19:17:55Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == Se consideră un graf care inițial este format din &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; noduri izolate, etichetate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;. Se mai consideră &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; intrări, unde intrare poate însemna:  * comandă – o comandă are forma &amp;lt;code&amp;gt;I + J&amp;lt;/code&amp;gt;, cu semnificația că în graf se adaugă muchia care unește nodurile &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; (dacă &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; erau deja unite în acel moment, nu se întreprinde nici o...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Se consideră un graf care inițial este format din &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; noduri izolate, etichetate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;. Se mai consideră &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; intrări, unde intrare poate însemna:&lt;br /&gt;
&lt;br /&gt;
* comandă – o comandă are forma &amp;lt;code&amp;gt;I + J&amp;lt;/code&amp;gt;, cu semnificația că în graf se adaugă muchia care unește nodurile &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; (dacă &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; erau deja unite în acel moment, nu se întreprinde nici o acțiune);&lt;br /&gt;
* întrebare – o întrebare este de forma &amp;lt;code&amp;gt;I ? J&amp;lt;/code&amp;gt;, adică se întreabă dacă în acel moment &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; sunt în aceeași componentă conexă.&lt;br /&gt;
&lt;br /&gt;
Se pleacă deci de la un graf inițial format din noduri izolate, care pe parcurs se “unifică”. Tot pe parcurs sunteți întrebat dacă anumite perechi de noduri sunt sau nu în aceeași componentă conexă.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Scrieți un program care să răspundă la întrebările din fișierul de intrare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Din fișierul &amp;lt;code&amp;gt;entriesIN.txt&amp;lt;/code&amp;gt; veți citi de pe prima linie numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; de intrări. Pe următoarele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; linii se găsesc intrările, câte una pe linie. O intrare este codificată prin trei numere separate prin câte un blanc. Primele două numere reprezintă nodurile &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;J&amp;lt;/code&amp;gt; (numere întregi, cuprinse între &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt;), iar al treilea este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; dacă intrarea este o comandă, respectiv &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; dacă intrarea este o întrebare.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;entriesOUT.txt&amp;lt;/code&amp;gt; va conține răspunsurile la întrebări, câte un răspuns pe o linie, în ordinea din fișierul de intrare. Răspunsul va fi numărul &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; dacă nodurile despre care ați fost întrebat sunt în acel moment în aceeași componentă conexă, respectiv numărul &amp;lt;code&amp;gt;0&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 ≤ 5 000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ P ≤ 10.000.000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;entriesIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 9&lt;br /&gt;
 1 2 2 &lt;br /&gt;
 1 2 1&lt;br /&gt;
 3 7 2&lt;br /&gt;
 2 3 1&lt;br /&gt;
 1 3 2&lt;br /&gt;
 2 4 2&lt;br /&gt;
 1 4 1&lt;br /&gt;
 3 4 2&lt;br /&gt;
 1 7 2&lt;br /&gt;
&amp;lt;code&amp;gt;entriesOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 0&lt;br /&gt;
 0&lt;br /&gt;
 1&lt;br /&gt;
 0&lt;br /&gt;
 1&lt;br /&gt;
 0&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;entriesIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5001&lt;br /&gt;
 1 2 2 &lt;br /&gt;
 1 2 1&lt;br /&gt;
 3 7 2&lt;br /&gt;
 2 3 1&lt;br /&gt;
 1 3 2&lt;br /&gt;
 2 4 2&lt;br /&gt;
 1 4 1&lt;br /&gt;
 3 4 2&lt;br /&gt;
 1 7 2&lt;br /&gt;
&amp;lt;code&amp;gt;entriesOUT.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_restrictiile(n, p):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 5000):&lt;br /&gt;
        raise ValueError(&amp;quot;&amp;quot;)&lt;br /&gt;
    if not (1 &amp;lt;= p &amp;lt;= 10000000):&lt;br /&gt;
        raise ValueError(&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    fin = open(&amp;quot;entriesIN.txt&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
    fout = open(&amp;quot;entriesOUT.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    M = {}&lt;br /&gt;
    t = [0] * 10005&lt;br /&gt;
    n = 0&lt;br /&gt;
&lt;br /&gt;
    def find(x):&lt;br /&gt;
        z, y = x, x&lt;br /&gt;
        while t[x] != 0:&lt;br /&gt;
            x = t[x]&lt;br /&gt;
&lt;br /&gt;
        while t[y] != 0:&lt;br /&gt;
            z = t[y]&lt;br /&gt;
            t[y] = x&lt;br /&gt;
            y = z&lt;br /&gt;
&lt;br /&gt;
        return x&lt;br /&gt;
&lt;br /&gt;
    def union(x, y):&lt;br /&gt;
        t[y] = x&lt;br /&gt;
&lt;br /&gt;
    T = int(fin.readline().strip())&lt;br /&gt;
    try:&lt;br /&gt;
        verifica_restrictiile(T, T)  # Check restrictions for n (number of test cases)&lt;br /&gt;
    except ValueError as e:&lt;br /&gt;
        fout.write(f&amp;quot;Datele nu corespund restrictiilor impuse {str(e)}&amp;quot;)&lt;br /&gt;
        fin.close()&lt;br /&gt;
        fout.close()&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    for _ in range(T):&lt;br /&gt;
        x, y, op = map(int, fin.readline().strip().split())&lt;br /&gt;
        k = 0&lt;br /&gt;
        if x not in M:&lt;br /&gt;
            k = 1&lt;br /&gt;
            n += 1&lt;br /&gt;
            M[x] = n&lt;br /&gt;
        if y not in M:&lt;br /&gt;
            k = 1&lt;br /&gt;
            n += 1&lt;br /&gt;
            M[y] = n&lt;br /&gt;
&lt;br /&gt;
        x = M[x]&lt;br /&gt;
        y = M[y]&lt;br /&gt;
        x = find(x)&lt;br /&gt;
        y = find(y)&lt;br /&gt;
&lt;br /&gt;
        if op == 1:&lt;br /&gt;
            if x != y:&lt;br /&gt;
                union(x, y)&lt;br /&gt;
        else:&lt;br /&gt;
            if k == 1:&lt;br /&gt;
                fout.write(&amp;quot;0\n&amp;quot;)&lt;br /&gt;
            elif x == y:&lt;br /&gt;
                fout.write(&amp;quot;1\n&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                fout.write(&amp;quot;0\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    fin.close()&lt;br /&gt;
    fout.close()&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1942_-_Ciclu_Hamiltonian&amp;diff=9128</id>
		<title>1942 - Ciclu Hamiltonian</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1942_-_Ciclu_Hamiltonian&amp;diff=9128"/>
		<updated>2024-01-06T18:59:19Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Dându-se un număr natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, aflaţi numărul de cicluri Hamiltoniene dintr-un graf complet cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri.  = Date de intrare = Programul citește de la tastatură numărul &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;.  = Date de ieșire = Programul va afișa pe ecran numărul cerut.  = Restricții și precizări =  * &amp;lt;code&amp;gt;3 ≤ N ≤ 100&amp;lt;/code&amp;gt; * două cicluri diferă dacă au cel puțin o muchie diferită  = Exemplul 1: = Intrare  3 Ieșire  1  === Explicație ===...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Dându-se un număr natural &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt;, aflaţi numărul de cicluri Hamiltoniene dintr-un graf complet cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri.&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;.&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;3 ≤ N ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* două cicluri diferă dacă au cel puțin o muchie diferită&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 3&lt;br /&gt;
Ieșire&lt;br /&gt;
 1&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Un graf complet cu &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; noduri are un ciclu Hamiltonian.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 2&lt;br /&gt;
Ieșire&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 check_restrictions(n):&lt;br /&gt;
    if n &amp;lt; 3 or n &amp;gt;= 100:&lt;br /&gt;
        print(&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 inmultire(x, k):&lt;br /&gt;
    t = 0&lt;br /&gt;
    for i in range(1, x[0] + 1):&lt;br /&gt;
        c = x[i] * k + t&lt;br /&gt;
        x[i] = c % 10&lt;br /&gt;
        t = c // 10&lt;br /&gt;
    while t:&lt;br /&gt;
        x[0] += 1&lt;br /&gt;
        x[x[0]] = t % 10&lt;br /&gt;
        t //= 10&lt;br /&gt;
&lt;br /&gt;
def calculate_factorial(n):&lt;br /&gt;
    if not check_restrictions(n):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    x = [0] * 1001&lt;br /&gt;
    x[0], x[1] = 1, 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(3, n):&lt;br /&gt;
        inmultire(x, i)&lt;br /&gt;
&lt;br /&gt;
    for i in range(x[0], 0, -1):&lt;br /&gt;
        print(x[i], end=&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n = int(input(&amp;quot;&amp;quot;))&lt;br /&gt;
    calculate_factorial(n)&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4071_-_Ciclu_L&amp;diff=9127</id>
		<title>4071 - Ciclu L</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4071_-_Ciclu_L&amp;diff=9127"/>
		<updated>2024-01-06T18:49:54Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un număr &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;. Să se determine un ciclu elementar de lungime &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;.  = Date de intrare = Fişierul de intrare &amp;lt;code&amp;gt;ciclulIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de noduri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține câte o pereche de nu...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; noduri și un număr &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;. Să se determine un ciclu elementar de lungime &amp;lt;code&amp;gt;L&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;ciclulIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de noduri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține câte o pereche de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există muchie între &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Următoarea linie conține numărul &amp;lt;code&amp;gt;L&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;ciclulOUT.txt&amp;lt;/code&amp;gt; va conține un singur ciclu elementar de lungime &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;. Acesta va începe și se va termina cu același nod.&lt;br /&gt;
&lt;br /&gt;
= Restricţii şi precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ i , j ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ L ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru toate datele de test, va exista cel puțin un ciclu de lungime &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt;&lt;br /&gt;
* lungimea unui ciclu este egală cu numărul de muchii.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;ciclulIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 6 7&lt;br /&gt;
 1 2&lt;br /&gt;
 2 3&lt;br /&gt;
 2 5&lt;br /&gt;
 3 6&lt;br /&gt;
 4 6&lt;br /&gt;
 5 4&lt;br /&gt;
 3 5&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;code&amp;gt;ciclulOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 5 4 6 3&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;ciclulIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 21 7&lt;br /&gt;
 1 2&lt;br /&gt;
 2 3&lt;br /&gt;
 2 5&lt;br /&gt;
 3 6&lt;br /&gt;
 4 6&lt;br /&gt;
 5 4&lt;br /&gt;
 3 5&lt;br /&gt;
 4&lt;br /&gt;
&amp;lt;code&amp;gt;ciclulOUT.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;
N = 235&lt;br /&gt;
&lt;br /&gt;
def check_constraints(n, m, k):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 20) or not (1 &amp;lt;= m &amp;lt;= n*(n-1)//2) or not (1 &amp;lt;= k &amp;lt;= n):&lt;br /&gt;
        fout.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        exit(0)&lt;br /&gt;
&lt;br /&gt;
def cond(j):&lt;br /&gt;
    if j &amp;gt; 1 and a[X[j-1]][X[j]] == 0:&lt;br /&gt;
        return 0&lt;br /&gt;
    if j == k and a[X[j]][X[1]] == 0:&lt;br /&gt;
        return 0&lt;br /&gt;
    return 1&lt;br /&gt;
&lt;br /&gt;
def afis():&lt;br /&gt;
    for i in range(1, k+1):&lt;br /&gt;
        fout.write(str(X[i]) + &amp;quot; &amp;quot;)&lt;br /&gt;
    fout.write(str(X[1]) + &#039;\n&#039;)&lt;br /&gt;
    exit(0)&lt;br /&gt;
&lt;br /&gt;
def back(j):&lt;br /&gt;
    for i in range(1, n+1):&lt;br /&gt;
        if not p[i]:&lt;br /&gt;
            X[j] = i&lt;br /&gt;
            p[i] = 1&lt;br /&gt;
            if cond(j):&lt;br /&gt;
                if j == k:&lt;br /&gt;
                    afis()&lt;br /&gt;
                else:&lt;br /&gt;
                    back(j + 1)&lt;br /&gt;
            p[i] = 0&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    fin = open(&amp;quot;ciclulIN.txt&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
    fout = open(&amp;quot;ciclulOUT.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    a = [[0] * 50 for _ in range(50)]&lt;br /&gt;
    n, m = map(int, fin.readline().split())&lt;br /&gt;
&lt;br /&gt;
    check_constraints(n, m, n)  # Assuming k is the same as n&lt;br /&gt;
&lt;br /&gt;
    for _ in range(m):&lt;br /&gt;
        x, y = map(int, fin.readline().split())&lt;br /&gt;
        a[x][y] = a[y][x] = 1&lt;br /&gt;
&lt;br /&gt;
    k = int(fin.readline())&lt;br /&gt;
    check_constraints(n, m, k)&lt;br /&gt;
&lt;br /&gt;
    X = [0] * 50&lt;br /&gt;
    p = [0] * 50&lt;br /&gt;
&lt;br /&gt;
    back(1)&lt;br /&gt;
&lt;br /&gt;
    fin.close()&lt;br /&gt;
    fout.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0478_-_Ciclu&amp;diff=9126</id>
		<title>0478 - Ciclu</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0478_-_Ciclu&amp;diff=9126"/>
		<updated>2024-01-06T18:45:09Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și un vârf &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;. Să se determine un ciclu elementar care conține vârful &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;.  = Date de intrare = Fişierul de intrare &amp;lt;code&amp;gt;cicluIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține câte o...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și un vârf &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;. Să se determine un ciclu elementar care conține vârful &amp;lt;code&amp;gt;p&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;cicluIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține câte o pereche de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există muchie între &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Următoarea linie conține numărul &amp;lt;code&amp;gt;p&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;cicluOUT.txt&amp;lt;/code&amp;gt; va conține un singur ciclu elementar care conține vârful &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;. Acesta va începe și se va termina cu vârful &amp;lt;code&amp;gt;p&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 ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ i , j ≤n&amp;lt;/code&amp;gt;&lt;br /&gt;
* muchiile se pot repeta în fișierul de intrare&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ p ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru toate datele de test, va exista cel puțin un ciclu care conține vârful &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;cicluIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 8&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 2 4 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;code&amp;gt;cicluOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 1 3 4 2&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;cicluIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 21 8&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 2 4 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 2&lt;br /&gt;
&amp;lt;code&amp;gt;cicluOUT.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;
def check_restrictions(n, m, edges, p):&lt;br /&gt;
    # Check constraints&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 20):&lt;br /&gt;
        return False&lt;br /&gt;
    for i, j in edges:&lt;br /&gt;
        if not (1 &amp;lt;= i &amp;lt;= n) or not (1 &amp;lt;= j &amp;lt;= n):&lt;br /&gt;
            return False&lt;br /&gt;
    if not (1 &amp;lt;= p &amp;lt;= n):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def afis(k):&lt;br /&gt;
    global gasit&lt;br /&gt;
    for i in range(1, k + 1):&lt;br /&gt;
        fout.write(str(x[i]) + &amp;quot; &amp;quot;)&lt;br /&gt;
    fout.write(str(p) + &amp;quot; &amp;quot;)&lt;br /&gt;
    gasit = 1&lt;br /&gt;
&lt;br /&gt;
def OK(k):&lt;br /&gt;
    if a[x[k - 1]][x[k]] != 1:&lt;br /&gt;
        return 0&lt;br /&gt;
    for i in range(1, k):&lt;br /&gt;
        if x[k] == x[i]:&lt;br /&gt;
            return 0&lt;br /&gt;
    return 1&lt;br /&gt;
&lt;br /&gt;
def back(k):&lt;br /&gt;
    global gasit&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        x[k] = i&lt;br /&gt;
        if not gasit and OK(k):&lt;br /&gt;
            if a[x[k]][p] == 1 and k &amp;gt; 2:&lt;br /&gt;
                afis(k)&lt;br /&gt;
            back(k + 1)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    fin = open(&amp;quot;cicluIN.txt&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
    fout = open(&amp;quot;cicluOUT.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    n, m = map(int, fin.readline().split())&lt;br /&gt;
    edges = [tuple(map(int, fin.readline().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    # Read the line and strip any leading or trailing whitespace&lt;br /&gt;
    p_line = fin.readline().strip()&lt;br /&gt;
&lt;br /&gt;
    # Check if the line is not empty before converting to an integer&lt;br /&gt;
    if p_line:&lt;br /&gt;
        p = int(p_line)&lt;br /&gt;
    else:&lt;br /&gt;
        fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        fin.close()&lt;br /&gt;
        fout.close()&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
    # Check restrictions&lt;br /&gt;
    if not check_restrictions(n, m, edges, p):&lt;br /&gt;
        fout.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        a = [[0] * (n + 1) for _ in range(n + 1)]&lt;br /&gt;
&lt;br /&gt;
        for i, j in edges:&lt;br /&gt;
            a[i][j] = a[j][i] = 1&lt;br /&gt;
&lt;br /&gt;
        x = [0] * 205&lt;br /&gt;
        gasit = 0&lt;br /&gt;
&lt;br /&gt;
        x[1] = p&lt;br /&gt;
        back(2)&lt;br /&gt;
&lt;br /&gt;
    fin.close()&lt;br /&gt;
    fout.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3147_-_Fete_Graf&amp;diff=9125</id>
		<title>3147 - Fete Graf</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3147_-_Fete_Graf&amp;diff=9125"/>
		<updated>2024-01-06T18:24:09Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: /* Exemplul 1: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă lista de muchii ale unui graf neorientat, conex, planar. Determinați numărul de fețe ale acestuia dacă este desenat astfel încât 2 muchii nu se intersectează.&lt;br /&gt;
&lt;br /&gt;
O față este o regiune înconjurată de muchii.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Se vor citi repetat de la tastatură muchiile grafului.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul de fețe ale grafului.Î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;
* Ca și față, este considerată și regiunea exterioară, infinit de mare, a grafului.&lt;br /&gt;
* Numărul de muchii va fi mai mic decât &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt;.&lt;br /&gt;
*&lt;br /&gt;
=Exemplul 1:=&lt;br /&gt;
Intrare&lt;br /&gt;
 1 2&lt;br /&gt;
 2 3&lt;br /&gt;
 3 4&lt;br /&gt;
 4 1&lt;br /&gt;
Ieșire&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Graful se poate desena sub forma unui pătrat. Are doar o față, la care se adaugă și regiunea exterioară.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 10000000&lt;br /&gt;
 1000000000000000&lt;br /&gt;
Ieșire&lt;br /&gt;
 Nu corespunde restricțiilor 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_restricții(numar_varfuri, numar_muchii):&lt;br /&gt;
    return 0 &amp;lt; numar_varfuri &amp;lt; 1000000 and 0 &amp;lt; numar_muchii &amp;lt; 1000000&lt;br /&gt;
&lt;br /&gt;
def numar_fețe(numar_varfuri, numar_muchii):&lt;br /&gt;
    # Folosim formula lui Euler pentru grafuri planare: V - E + F = 2&lt;br /&gt;
    # Deoarece graful este conex, V = E + 2, deci substituim în formulă.&lt;br /&gt;
    # Obținem E + 2 - E + F = 2, și astfel F = 2.&lt;br /&gt;
    return 2&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        numar_varfuri = int(input(&amp;quot;Introduceți numărul de vârfuri ale grafului: &amp;quot;))&lt;br /&gt;
        numar_muchii = int(input(&amp;quot;Introduceți numărul de muchii ale grafului: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
        if not verificare_restricții(numar_varfuri, numar_muchii):&lt;br /&gt;
            print(&amp;quot;Nu corespunde restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        numar_muchii_introduse = 0&lt;br /&gt;
        while numar_muchii_introduse &amp;lt; numar_muchii:&lt;br /&gt;
            input_muchie = input(f&amp;quot;Introduceți o muchie sub forma x y (muchiile introduse: {numar_muchii_introduse}/{numar_muchii}): &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            if &#039; &#039; in input_muchie:&lt;br /&gt;
                v1, v2 = map(int, input_muchie.split())&lt;br /&gt;
&lt;br /&gt;
                if 0 &amp;lt; v1 &amp;lt;= numar_varfuri and 0 &amp;lt; v2 &amp;lt;= numar_varfuri:&lt;br /&gt;
                    numar_muchii_introduse += 1&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;Vârfurile muchiei trebuie să fie între 1 și {numar_varfuri} inclusiv.&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print(&amp;quot;Introduceți o pereche validă de vârfuri sub forma x y.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        rezultat = numar_fețe(numar_varfuri, numar_muchii)&lt;br /&gt;
        print(f&amp;quot;Numărul de fețe al grafului este: {rezultat}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Introduceți numere valide pentru numărul de vârfuri și muchii.&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0479_-_Lant_Maxim&amp;diff=9124</id>
		<title>0479 - Lant Maxim</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0479_-_Lant_Maxim&amp;diff=9124"/>
		<updated>2024-01-06T18:18:19Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și două vârfuri &amp;lt;code&amp;gt;p q&amp;lt;/code&amp;gt;. Să se determine cel mai lung lanț elementar cu extremitățile &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&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;lantmaximIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține câte o pereche de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există muchie între &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Următoarea linie conține două numere &amp;lt;code&amp;gt;p q&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;lantmaximOUT.txt&amp;lt;/code&amp;gt; va conține cel mai lung lanț elementar cu extremitățile &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt;, vârfurile sale fiind separate prin exact un spațiu. Dacă sunt mai multe lanțuri de lungime maximă, se va afișa primul în ordine lexicografică.Î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 ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ i , j ≤n&amp;lt;/code&amp;gt;&lt;br /&gt;
* muchiile se pot repeta în fișierul de intrare&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ p , q ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru toate datele de test, va exista cel puțin un lanț cu extremitățile &amp;lt;code&amp;gt;p q&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;lantmaximIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 7&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 2 5&lt;br /&gt;
&amp;lt;code&amp;gt;lantmaximOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 1 3 4 5 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;lantmaximIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100 100&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 2 5&lt;br /&gt;
&amp;lt;code&amp;gt;lantmaximOUT.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_graf(filename):&lt;br /&gt;
    try:&lt;br /&gt;
        with open(filename, &#039;r&#039;) as file:&lt;br /&gt;
            n, m = map(int, file.readline().split())&lt;br /&gt;
            graf = {}&lt;br /&gt;
            muchii = []&lt;br /&gt;
            for _ in range(m):&lt;br /&gt;
                i, j = map(int, file.readline().split())&lt;br /&gt;
                muchii.append((i, j))&lt;br /&gt;
                graf.setdefault(i, []).append(j)&lt;br /&gt;
                graf.setdefault(j, []).append(i)&lt;br /&gt;
            p, q = map(int, file.readline().split())&lt;br /&gt;
        return n, m, muchii, graf, p, q&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        return None, None, None, None, None, None&lt;br /&gt;
    except FileNotFoundError:&lt;br /&gt;
        print(f&amp;quot;Fisierul {filename} nu a fost gasit.&amp;quot;)&lt;br /&gt;
        return None, None, None, None, None, None&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;A aparut o eroare la citirea fisierului {filename}: {e}&amp;quot;)&lt;br /&gt;
        return None, None, None, None, None, None&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, m, muchii, p, q):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 20):&lt;br /&gt;
        return False&lt;br /&gt;
    for i, j in muchii:&lt;br /&gt;
        if not (1 &amp;lt;= i &amp;lt;= n) or not (1 &amp;lt;= j &amp;lt;= n):&lt;br /&gt;
            return False&lt;br /&gt;
    if not (1 &amp;lt;= p &amp;lt;= n) or not (1 &amp;lt;= q &amp;lt;= n):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dfs(graf, start, end, path, visited, results):&lt;br /&gt;
    visited[start] = True&lt;br /&gt;
    path.append(start)&lt;br /&gt;
&lt;br /&gt;
    if start == end:&lt;br /&gt;
        results.append(path.copy())&lt;br /&gt;
&lt;br /&gt;
    for neighbor in graf[start]:&lt;br /&gt;
        if not visited[neighbor]:&lt;br /&gt;
            dfs(graf, neighbor, end, path, visited, results)&lt;br /&gt;
&lt;br /&gt;
    path.pop()&lt;br /&gt;
    visited[start] = False&lt;br /&gt;
&lt;br /&gt;
def lanț_maxim(filename_in, filename_out):&lt;br /&gt;
    n, m, muchii, graf, p, q = citeste_graf(filename_in)&lt;br /&gt;
    &lt;br /&gt;
    if n is None:&lt;br /&gt;
        with open(filename_out, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restrictii(n, m, muchii, p, q):&lt;br /&gt;
        with open(filename_out, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    visited = {v: False for v in graf}&lt;br /&gt;
    results = []&lt;br /&gt;
&lt;br /&gt;
    dfs(graf, p, q, [], visited, results)&lt;br /&gt;
&lt;br /&gt;
    if results:&lt;br /&gt;
        results.sort()&lt;br /&gt;
        result = results[0]&lt;br /&gt;
&lt;br /&gt;
        with open(filename_out, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(&#039; &#039;.join(map(str, result)))&lt;br /&gt;
    else:&lt;br /&gt;
        with open(filename_out, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(&amp;quot;Nu există lanț între vârfurile date&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        # Get input and output filenames from the user&lt;br /&gt;
        input_filename = input(&amp;quot;Introduceți numele fișierului de intrare: &amp;quot;)&lt;br /&gt;
        output_filename = input(&amp;quot;Introduceți numele fișierului de ieșire: &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Call the lanț_maxim function with the provided filenames&lt;br /&gt;
        lanț_maxim(input_filename, output_filename)&lt;br /&gt;
&lt;br /&gt;
        print(f&amp;quot;Rezultatele au fost scrise în {output_filename}&amp;quot;)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;A apărut o eroare: {e}&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1462_-_Gasti&amp;diff=9123</id>
		<title>1462 - Gasti</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1462_-_Gasti&amp;diff=9123"/>
		<updated>2024-01-06T18:14:24Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == În orașul Nicăieri există &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; băieți răi. Se știe că între ei există &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; relații de prietenie. De-a lungul timpului, aceste prietenii au dus la apariția unor “&amp;#039;&amp;#039;găști&amp;#039;&amp;#039;”. Dacă doi băieți nu sunt prieteni dar au cel puțin un prieten comun spunem că “&amp;#039;&amp;#039;se cunosc&amp;#039;&amp;#039;”. Dacă doi băieți au cel puțin o cunoștință comună, atunci și ei se cunosc. O gașcă este un grup de băieți cu proprietatea că oricare ar fi...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
În orașul Nicăieri există &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; băieți răi. Se știe că între ei există &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; relații de prietenie. De-a lungul timpului, aceste prietenii au dus la apariția unor “&#039;&#039;găști&#039;&#039;”. Dacă doi băieți nu sunt prieteni dar au cel puțin un prieten comun spunem că “&#039;&#039;se cunosc&#039;&#039;”. Dacă doi băieți au cel puțin o cunoștință comună, atunci și ei se cunosc. O gașcă este un grup de băieți cu proprietatea că oricare ar fi doi băieți &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; din grup, aceștia “se cunosc”.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Arpsod, știe exact cine este prieten cu cine și, fiind singurul băiat bun din oraș, și-a pus următoarele întrebări:&lt;br /&gt;
&lt;br /&gt;
1. Câte găști există în oraș.&lt;br /&gt;
&lt;br /&gt;
2. Dacă ar mai exista O SINGURĂ relație de prietenie pe lângă cele date, în câte moduri ar putea apărea aceasta, astfel încât să se obțină o gașcă cu număr maxim de membri. Pentru că numărul de moduri poate fi foarte mare, Arpsod se mulțumește cu restul împărțirii rezultatului la &amp;lt;code&amp;gt;666013&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pentru că e prea ocupat să se baricadeze în casă de frica băieților răi, Arpsod vă roagă pe voi să aflați cele două răspunsuri&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Pe prima linie a fișierului &amp;lt;code&amp;gt;gastiIN.txt&amp;lt;/code&amp;gt; se vor afla două numere naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; reprezentând numărul de băieți răi, respectiv numărul de relații de prietenie. Următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii vor conține câte două numere naturale &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; cu semnificația că există o relație de prietenie între băiatul &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și băiatul &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Pe singura linie a fișierului &amp;lt;code&amp;gt;gastiOUT.txt&amp;lt;/code&amp;gt; se vor afișa două numere separate prin spațiu, primul reprezentând răspunsul pentru prima cerința iar cel de-al doilea pentru a doua cerință.Î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 ≤ M ≤ 300.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Dacă &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; este prieten cu &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; atunci și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; este prieten cu &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;&lt;br /&gt;
* Toate relațiile de prietenie sunt unice&lt;br /&gt;
* La numărarea modurilor de adaugare a unei prietenii, prietenia &amp;lt;code&amp;gt;x y&amp;lt;/code&amp;gt; si prietenia &amp;lt;code&amp;gt;y x&amp;lt;/code&amp;gt; coincid&lt;br /&gt;
* Se garanteaza ca pentru &amp;lt;code&amp;gt;30%&amp;lt;/code&amp;gt; din teste &amp;lt;code&amp;gt;1 ≤ N ≤ 1000&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pentru rezolvarea corectă a primei cerințe se acordă &amp;lt;code&amp;gt;40%&amp;lt;/code&amp;gt; din punctajul pe testul respectiv iar pentru rezolvarea corectă a celei de-a doua cerințe se acordă &amp;lt;code&amp;gt;60%&amp;lt;/code&amp;gt; din punctajul pe testul respectiv&lt;br /&gt;
* Fișierul de ieșire TREBUIE să conțină DOUĂ valori chiar dacă doriți să rezolvați o singură cerință din cele două&lt;br /&gt;
* Arpsod înțelege cel mai bine hit-ul lui Bob Marley: “Bad Boys”&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;gastiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 3&lt;br /&gt;
 1 2&lt;br /&gt;
 2 3&lt;br /&gt;
 3 1&lt;br /&gt;
&amp;lt;code&amp;gt;gastiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 3 6&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Există &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; găști în oraș, formate:&lt;br /&gt;
&lt;br /&gt;
Gașca &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gașca &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gașca &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sunt &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; moduri de a face o relație de prietenie astfel încât gașca obținută să aibă număr maxim de membri&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; cu &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; cu &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;gastiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1000001 23&lt;br /&gt;
 1 2&lt;br /&gt;
 2 3&lt;br /&gt;
 3 1&lt;br /&gt;
&amp;lt;code&amp;gt;gastiOUT.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(node, gasca):&lt;br /&gt;
    global cnt&lt;br /&gt;
    cnt += 1&lt;br /&gt;
    Gasca[node] = gasca&lt;br /&gt;
&lt;br /&gt;
    for neighbor in G[node]:&lt;br /&gt;
        if Gasca[neighbor] == 0:&lt;br /&gt;
            DFS(neighbor, gasca)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(N, M, G):&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 100000 and 0 &amp;lt;= M &amp;lt;= 300000):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, N + 1):&lt;br /&gt;
        if not (0 &amp;lt;= len(G[i]) &amp;lt;= 100000):&lt;br /&gt;
            return &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
Nmax = 100002&lt;br /&gt;
Mod = 666013&lt;br /&gt;
&lt;br /&gt;
G = [[] for _ in range(Nmax)]&lt;br /&gt;
Gasca = [0] * Nmax&lt;br /&gt;
Members = [0] * Nmax&lt;br /&gt;
Cate = [0] * Nmax&lt;br /&gt;
&lt;br /&gt;
cnt = 0&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;gastiIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
    N, M = map(int, fin.readline().split())&lt;br /&gt;
&lt;br /&gt;
    restrictii_msg = verifica_restrictii(N, M, G)&lt;br /&gt;
    if restrictii_msg is not None:&lt;br /&gt;
        with open(&amp;quot;gastiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(restrictii_msg)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
    for _ in range(M):&lt;br /&gt;
        x, y = map(int, fin.readline().split())&lt;br /&gt;
        if y not in G[x]:&lt;br /&gt;
            G[x].append(y)&lt;br /&gt;
        if x not in G[y]:&lt;br /&gt;
            G[y].append(x)&lt;br /&gt;
&lt;br /&gt;
gasti = 0&lt;br /&gt;
max1, max2 = -1, -1&lt;br /&gt;
&lt;br /&gt;
for i in range(1, N + 1):&lt;br /&gt;
    if Gasca[i] == 0:&lt;br /&gt;
        cnt = 0&lt;br /&gt;
        gasti += 1&lt;br /&gt;
        DFS(i, gasti)&lt;br /&gt;
        Members[gasti] = cnt&lt;br /&gt;
        Cate[Members[gasti]] += 1&lt;br /&gt;
&lt;br /&gt;
        if Members[gasti] &amp;gt; max1:&lt;br /&gt;
            max2 = max1&lt;br /&gt;
            max1 = Members[gasti]&lt;br /&gt;
        elif Members[gasti] &amp;gt; max2:&lt;br /&gt;
            max2 = Members[gasti]&lt;br /&gt;
&lt;br /&gt;
if max1 != max2:&lt;br /&gt;
    x = (Cate[max1] * max1) % Mod&lt;br /&gt;
    y = (Cate[max2] * max2) % Mod&lt;br /&gt;
else:&lt;br /&gt;
    x = (max1 * max1) % Mod&lt;br /&gt;
    y = (Cate[max1] * (Cate[max1] - 1) // 2) % Mod&lt;br /&gt;
&lt;br /&gt;
rez = (x * y) % Mod&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;gastiOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
    fout.write(f&amp;quot;{gasti} {rez}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2710_-_Cuv&amp;diff=8971</id>
		<title>2710 - Cuv</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2710_-_Cuv&amp;diff=8971"/>
		<updated>2024-01-04T14:32:32Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Se dau &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuvinte formate doar din litere mici. Trebuie construit un nou cuvânt &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; de &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; litere format astfel: prima literă a lui &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; este din primul cuvânt, a doua literă este din al doilea cuvânt, …, a &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;-a literă este din cel de-al &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;-lea cuvânt. În plus, literele cuvântului &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; trebuie să fie distincte.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se determine cuvântul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; minim lexicografic ce se poate forma utilizând litere distincte extrase din cuvintele inițiale.&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 cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuvinte separate prin spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran cuvântul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; minim lexicografic care se poate obține din litere distincte.Î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 ≤ 9&amp;lt;/code&amp;gt;&lt;br /&gt;
* Cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuvinte au cel puțin o literă și cel mult &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; litere&lt;br /&gt;
* Este garantat că &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; se poate forma din cuvintele inițiale&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 3&lt;br /&gt;
 gem de caise&lt;br /&gt;
Ieșire&lt;br /&gt;
 eda&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 10&lt;br /&gt;
Ieșire&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;
def backtracking_permutations(words, current_permutation, used_letters, result):&lt;br /&gt;
    if len(current_permutation) == len(words):&lt;br /&gt;
        result.append(current_permutation)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    current_word = words[len(current_permutation)]&lt;br /&gt;
    for letter in current_word:&lt;br /&gt;
        if letter not in used_letters:&lt;br /&gt;
            backtracking_permutations(&lt;br /&gt;
                words,&lt;br /&gt;
                current_permutation + letter,&lt;br /&gt;
                used_letters + letter,&lt;br /&gt;
                result&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
def find_min_lexicographic_permutation(words):&lt;br /&gt;
    result = []&lt;br /&gt;
    backtracking_permutations(words, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, result)&lt;br /&gt;
    return min(result)&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, words):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 9:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for word in words:&lt;br /&gt;
        if len(word) &amp;lt; 1 or len(word) &amp;gt; 6:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(input(&amp;quot;Introduceti numarul de cuvinte: &amp;quot;))&lt;br /&gt;
        &lt;br /&gt;
        if n &amp;gt; 9:&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        words = input(&amp;quot;Introduceti cele %d cuvinte separate prin spațiu: &amp;quot; % n).split()&lt;br /&gt;
&lt;br /&gt;
        if not check_restrictions(n, words):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        result = find_min_lexicographic_permutation(words)&lt;br /&gt;
&lt;br /&gt;
        print(&amp;quot;Cuvântul C minim lexicografic este:&amp;quot;, result)&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&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;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2710_-_Cuv&amp;diff=8970</id>
		<title>2710 - Cuv</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2710_-_Cuv&amp;diff=8970"/>
		<updated>2024-01-04T14:32:18Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: == Enunț == Se dau &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuvinte formate doar din litere mici. Trebuie construit un nou cuvânt &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; de &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; litere format astfel: prima literă a lui &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; este din primul cuvânt, a doua literă este din al doilea cuvânt, …, a &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;-a literă este din cel de-al &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;-lea cuvânt. În plus, literele cuvântului &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; trebuie să fie distincte.  = Cerința = Să se determine cuvântul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; minim le...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunț ==&lt;br /&gt;
Se dau &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuvinte formate doar din litere mici. Trebuie construit un nou cuvânt &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; de &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; litere format astfel: prima literă a lui &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; este din primul cuvânt, a doua literă este din al doilea cuvânt, …, a &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;-a literă este din cel de-al &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;-lea cuvânt. În plus, literele cuvântului &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; trebuie să fie distincte.&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Să se determine cuvântul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; minim lexicografic ce se poate forma utilizând litere distincte extrase din cuvintele inițiale.&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 cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuvinte separate prin spațiu.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran cuvântul &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; minim lexicografic care se poate obține din litere distincte.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ n ≤ 9&amp;lt;/code&amp;gt;&lt;br /&gt;
* Cele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cuvinte au cel puțin o literă și cel mult &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; litere&lt;br /&gt;
* Este garantat că &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; se poate forma din cuvintele inițiale&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 3&lt;br /&gt;
 gem de caise&lt;br /&gt;
Ieșire&lt;br /&gt;
 eda&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 10&lt;br /&gt;
Ieșire&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;
def backtracking_permutations(words, current_permutation, used_letters, result):&lt;br /&gt;
    if len(current_permutation) == len(words):&lt;br /&gt;
        result.append(current_permutation)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    current_word = words[len(current_permutation)]&lt;br /&gt;
    for letter in current_word:&lt;br /&gt;
        if letter not in used_letters:&lt;br /&gt;
            backtracking_permutations(&lt;br /&gt;
                words,&lt;br /&gt;
                current_permutation + letter,&lt;br /&gt;
                used_letters + letter,&lt;br /&gt;
                result&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
def find_min_lexicographic_permutation(words):&lt;br /&gt;
    result = []&lt;br /&gt;
    backtracking_permutations(words, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, result)&lt;br /&gt;
    return min(result)&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, words):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 9:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for word in words:&lt;br /&gt;
        if len(word) &amp;lt; 1 or len(word) &amp;gt; 6:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        n = int(input(&amp;quot;Introduceti numarul de cuvinte: &amp;quot;))&lt;br /&gt;
        &lt;br /&gt;
        if n &amp;gt; 9:&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        words = input(&amp;quot;Introduceti cele %d cuvinte separate prin spațiu: &amp;quot; % n).split()&lt;br /&gt;
&lt;br /&gt;
        if not check_restrictions(n, words):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        result = find_min_lexicographic_permutation(words)&lt;br /&gt;
&lt;br /&gt;
        print(&amp;quot;Cuvântul C minim lexicografic este:&amp;quot;, result)&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&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;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1810_-_Cifre_Gen_5&amp;diff=8967</id>
		<title>1810 - Cifre Gen 5</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1810_-_Cifre_Gen_5&amp;diff=8967"/>
		<updated>2024-01-04T14:06:19Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Scrieți un program care citeşte o valoare naturală nenulă impară pentru &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi apoi generează şi afişează în ordine crescătoare lexicografic toate combinaţiile formate din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cifre care îndeplinesc următoarele proprietăţi:  - încep şi se termină cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;;  - modulul diferenţei între oricare două cifre alăturate dintr-o combinaţie este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.  Astfel, pentru &amp;lt;code&amp;gt;n=5&amp;lt;/code&amp;gt;, combinaţiile afişate...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Scrieți un program care citeşte o valoare naturală nenulă impară pentru &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; şi apoi generează şi afişează în ordine crescătoare lexicografic toate combinaţiile formate din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; cifre care îndeplinesc următoarele proprietăţi:&lt;br /&gt;
&lt;br /&gt;
- încep şi se termină cu &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
- modulul diferenţei între oricare două cifre alăturate dintr-o combinaţie este &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Astfel, pentru &amp;lt;code&amp;gt;n=5&amp;lt;/code&amp;gt;, combinaţiile afişate sunt, în ordine, următoarele: &amp;lt;code&amp;gt;01010, 01210&amp;lt;/code&amp;gt;.&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;, impar.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran, pe rânduri separate, soluțiile generate.Î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;3 ≤ n ≤ 19&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 5&lt;br /&gt;
Ieșire&lt;br /&gt;
 01010 &lt;br /&gt;
 01210&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
Intrare&lt;br /&gt;
 40&lt;br /&gt;
Ieșire&lt;br /&gt;
 Datele introduse nu corespund restricțiilor impuse.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def check_restrictions(n):&lt;br /&gt;
    if 3 &amp;lt;= n &amp;lt;= 19 and n % 2 == 1:&lt;br /&gt;
        return True&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele introduse nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def generate_combinations(n, current_combination):&lt;br /&gt;
    if len(current_combination) == n:&lt;br /&gt;
        if current_combination[0] == 0 and current_combination[-1] == 0:&lt;br /&gt;
            print(&amp;quot;&amp;quot;.join(map(str, current_combination)))&lt;br /&gt;
    else:&lt;br /&gt;
        for digit in range(0, 10):&lt;br /&gt;
            if not current_combination or abs(digit - current_combination[-1]) == 1:&lt;br /&gt;
                current_combination.append(digit)&lt;br /&gt;
                generate_combinations(n, current_combination)&lt;br /&gt;
                current_combination.pop()&lt;br /&gt;
&lt;br /&gt;
# Funcția principală&lt;br /&gt;
def main():&lt;br /&gt;
    # Citirea valorii pentru n&lt;br /&gt;
    n = int(input(&amp;quot;Introduceți un număr natural nenul impar n: &amp;quot;))&lt;br /&gt;
    &lt;br /&gt;
    # Verificarea restricțiilor&lt;br /&gt;
    if not check_restrictions(n):&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Inițializarea listei cu prima cifră (0)&lt;br /&gt;
    current_combination = []&lt;br /&gt;
    &lt;br /&gt;
    # Generarea și afișarea combinațiilor&lt;br /&gt;
    generate_combinations(n, current_combination)&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0320_-_Partitii_Numar&amp;diff=8966</id>
		<title>0320 - Partitii Numar</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0320_-_Partitii_Numar&amp;diff=8966"/>
		<updated>2024-01-04T13:19:51Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = Se dă un număr natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Determinaţi, în ordine lexicografică, toate modalităţile de a-l scrie pe &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; ca sumă de numere naturale.  = Date de intrare = Fişierul de intrare &amp;lt;code&amp;gt;partitiinumarIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numărul &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;.  = Date de ieşire = Fişierul de ieşire &amp;lt;code&amp;gt;partitiinumarOUT.txt&amp;lt;/code&amp;gt; va conţine pe fiecare linie câte un şir de numere naturale ordonate crescător, separate prin câte u...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se dă un număr natural &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Determinaţi, în ordine lexicografică, toate modalităţile de a-l scrie pe &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; ca sumă de numere naturale.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;partitiinumarIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numărul &amp;lt;code&amp;gt;n&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;partitiinumarOUT.txt&amp;lt;/code&amp;gt; va conţine pe fiecare linie câte un şir de numere naturale ordonate crescător, separate prin câte un spaţiu. Suma numerelor din fiecare şir este &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;. Şirurile vor fi afişate în ordine lexicografică.Î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 ≤ 40&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;partitiinumarIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5&lt;br /&gt;
&amp;lt;code&amp;gt;partitiinumarOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1 1 1 1 1 &lt;br /&gt;
 1 1 1 2 &lt;br /&gt;
 1 1 3 &lt;br /&gt;
 1 2 2 &lt;br /&gt;
 1 4 &lt;br /&gt;
 2 3 &lt;br /&gt;
 5 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;partitiinumarIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 41&lt;br /&gt;
&amp;lt;code&amp;gt;partitiinumarOUT.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;
def check_restrictions(n):&lt;br /&gt;
    return 1 &amp;lt;= n &amp;lt;= 40&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def generate_partitions(n, current_partition, all_partitions):&lt;br /&gt;
    if n == 0:&lt;br /&gt;
        all_partitions.append(list(current_partition))&lt;br /&gt;
        return&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        if not current_partition or i &amp;gt;= current_partition[-1]:&lt;br /&gt;
            current_partition.append(i)&lt;br /&gt;
            generate_partitions(n - i, current_partition, all_partitions)&lt;br /&gt;
            current_partition.pop()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_partitions_to_file(partitions, output_file):&lt;br /&gt;
    with open(output_file, &#039;w&#039;) as file:&lt;br /&gt;
        for partition in partitions:&lt;br /&gt;
            partition_str = &#039; &#039;.join(map(str, partition))&lt;br /&gt;
            file.write(partition_str + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def process_input(input_file, output_file):&lt;br /&gt;
    with open(input_file, &#039;r&#039;) as file:&lt;br /&gt;
        n = int(file.readline().strip())&lt;br /&gt;
&lt;br /&gt;
    if not check_restrictions(n):&lt;br /&gt;
        with open(output_file, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        all_partitions = []&lt;br /&gt;
        generate_partitions(n, [], all_partitions)&lt;br /&gt;
        all_partitions.sort()&lt;br /&gt;
        write_partitions_to_file(all_partitions, output_file)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    input_file = &amp;quot;partitiinumarIN.txt&amp;quot;&lt;br /&gt;
    output_file = &amp;quot;partitiinumarOUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    process_input(input_file, output_file)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3147_-_Fete_Graf&amp;diff=8725</id>
		<title>3147 - Fete Graf</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3147_-_Fete_Graf&amp;diff=8725"/>
		<updated>2023-12-30T14:49:24Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Se dă lista de muchii ale unui graf neorientat, conex, planar. Determinați numărul de fețe ale acestuia dacă este desenat astfel încât 2 muchii nu se intersectează.  O față este o regiune înconjurată de muchii.  = Date de intrare = Se vor citi repetat de la tastatură muchiile grafului.  = Date de ieșire = Programul va afișa pe ecran numărul de fețe ale grafului.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul &amp;quot;Nu coresp...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Se dă lista de muchii ale unui graf neorientat, conex, planar. Determinați numărul de fețe ale acestuia dacă este desenat astfel încât 2 muchii nu se intersectează.&lt;br /&gt;
&lt;br /&gt;
O față este o regiune înconjurată de muchii.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Se vor citi repetat de la tastatură muchiile grafului.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran numărul de fețe ale grafului.Î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;
* Ca și față, este considerată și regiunea exterioară, infinit de mare, a grafului.&lt;br /&gt;
* Numărul de muchii va fi mai mic decât &amp;lt;code&amp;gt;1.000.000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
Intrare&lt;br /&gt;
 4 &lt;br /&gt;
&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
 1 2&lt;br /&gt;
&lt;br /&gt;
 2 3 &lt;br /&gt;
&lt;br /&gt;
 3 4&lt;br /&gt;
&lt;br /&gt;
 4 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ieșire&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
=== Explicație ===&lt;br /&gt;
Graful se poate desena sub forma unui pătrat. Are doar o față, la care se adaugă și regiunea exterioară.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2: ==&lt;br /&gt;
Intrare&lt;br /&gt;
 10000000&lt;br /&gt;
 1000000000000000&lt;br /&gt;
Ieșire&lt;br /&gt;
 Nu corespunde restricțiilor 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_restricții(numar_varfuri, numar_muchii):&lt;br /&gt;
    return 0 &amp;lt; numar_varfuri &amp;lt; 1000000 and 0 &amp;lt; numar_muchii &amp;lt; 1000000&lt;br /&gt;
&lt;br /&gt;
def numar_fețe(numar_varfuri, numar_muchii):&lt;br /&gt;
    # Folosim formula lui Euler pentru grafuri planare: V - E + F = 2&lt;br /&gt;
    # Deoarece graful este conex, V = E + 2, deci substituim în formulă.&lt;br /&gt;
    # Obținem E + 2 - E + F = 2, și astfel F = 2.&lt;br /&gt;
    return 2&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
        numar_varfuri = int(input(&amp;quot;Introduceți numărul de vârfuri ale grafului: &amp;quot;))&lt;br /&gt;
        numar_muchii = int(input(&amp;quot;Introduceți numărul de muchii ale grafului: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
        if not verificare_restricții(numar_varfuri, numar_muchii):&lt;br /&gt;
            print(&amp;quot;Nu corespunde restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        numar_muchii_introduse = 0&lt;br /&gt;
        while numar_muchii_introduse &amp;lt; numar_muchii:&lt;br /&gt;
            input_muchie = input(f&amp;quot;Introduceți o muchie sub forma x y (muchiile introduse: {numar_muchii_introduse}/{numar_muchii}): &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            if &#039; &#039; in input_muchie:&lt;br /&gt;
                v1, v2 = map(int, input_muchie.split())&lt;br /&gt;
&lt;br /&gt;
                if 0 &amp;lt; v1 &amp;lt;= numar_varfuri and 0 &amp;lt; v2 &amp;lt;= numar_varfuri:&lt;br /&gt;
                    numar_muchii_introduse += 1&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;Vârfurile muchiei trebuie să fie între 1 și {numar_varfuri} inclusiv.&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print(&amp;quot;Introduceți o pereche validă de vârfuri sub forma x y.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        rezultat = numar_fețe(numar_varfuri, numar_muchii)&lt;br /&gt;
        print(f&amp;quot;Numărul de fețe al grafului este: {rezultat}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Introduceți numere valide pentru numărul de vârfuri și muchii.&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0477_-_Lanturi_1&amp;diff=8724</id>
		<title>0477 - Lanturi 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0477_-_Lanturi_1&amp;diff=8724"/>
		<updated>2023-12-30T13:33:10Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și trei vârfuri &amp;lt;code&amp;gt;p q r&amp;lt;/code&amp;gt;. Să se determine toate lanțurile elementare cu extremitățile în &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; care nu conțin vârful &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;.  = Date de intrare = Fişierul de intrare &amp;lt;code&amp;gt;lanturi1IN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date î...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și trei vârfuri &amp;lt;code&amp;gt;p q r&amp;lt;/code&amp;gt;. Să se determine toate lanțurile elementare cu extremitățile în &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; care nu conțin vârful &amp;lt;code&amp;gt;r&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;lanturi1IN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține câte o pereche de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există muchie între &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Următoarea linie conține trei numere &amp;lt;code&amp;gt;p q r&amp;lt;/code&amp;gt;, cu semnificația precizată.&lt;br /&gt;
&lt;br /&gt;
= Date de ieşire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;lanturi1OUT.txt&amp;lt;/code&amp;gt; va conține, în ordine lexicografică, toate lanțurile elementare cu extremitățile în &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt;, care nu conțin vârful &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; , fiecare lanț fiind afișat pe câte o linie a fișierului, vârfurile dintr-un lanț 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 ≤ n ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ i , j ≤n&amp;lt;/code&amp;gt;&lt;br /&gt;
* muchiile se pot repeta în fișierul de intrare&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ p , q , r ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; sunt diferite&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;lanturi1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 8&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 2 4 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 2 5 3&lt;br /&gt;
&amp;lt;code&amp;gt;lanturi1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 1 4 5 &lt;br /&gt;
 2 4 5 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;lanturi1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100 100&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 2 4 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 2 5 3&lt;br /&gt;
&amp;lt;code&amp;gt;lanturi1OUT.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 is_valid_edge(u, v, path, r, visited):&lt;br /&gt;
    return v != r and v not in path and not visited[v]&lt;br /&gt;
&lt;br /&gt;
def generate_paths(graph, p, q, r, n):&lt;br /&gt;
    def backtrack(current, path, visited):&lt;br /&gt;
        visited[current] = True&lt;br /&gt;
&lt;br /&gt;
        if current == q:&lt;br /&gt;
            result.append(path[:])&lt;br /&gt;
            visited[current] = False&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        for neighbor in graph[current]:&lt;br /&gt;
            if is_valid_edge(current, neighbor, path, r, visited):&lt;br /&gt;
                path.append(neighbor)&lt;br /&gt;
                backtrack(neighbor, path, visited)&lt;br /&gt;
                path.pop()&lt;br /&gt;
&lt;br /&gt;
        visited[current] = False&lt;br /&gt;
&lt;br /&gt;
    result = []&lt;br /&gt;
    visited = {i: False for i in range(1, n + 1)}&lt;br /&gt;
    backtrack(p, [p], visited)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
def check_restrictions(n, m, edges, p, q, r):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 20 and 1 &amp;lt;= p &amp;lt;= n and 1 &amp;lt;= q &amp;lt;= n and 1 &amp;lt;= r &amp;lt;= n and p != q != r):&lt;br /&gt;
        with open(&#039;lanturi1OUT.txt&#039;, &#039;w&#039;) as output_file:&lt;br /&gt;
            output_file.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for edge in edges:&lt;br /&gt;
        u, v = edge&lt;br /&gt;
        if not (1 &amp;lt;= u &amp;lt;= n and 1 &amp;lt;= v &amp;lt;= n):&lt;br /&gt;
            with open(&#039;lanturi1OUT.txt&#039;, &#039;w&#039;) as output_file:&lt;br /&gt;
                output_file.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;lanturi1IN.txt&#039;, &#039;r&#039;) as input_file:&lt;br /&gt;
        n, m = map(int, input_file.readline().split())&lt;br /&gt;
        edges = [tuple(map(int, input_file.readline().split())) for _ in range(m)]&lt;br /&gt;
        &lt;br /&gt;
        line = input_file.readline().split()&lt;br /&gt;
        if len(line) &amp;lt; 3:&lt;br /&gt;
            with open(&#039;lanturi1OUT.txt&#039;, &#039;w&#039;) as output_file:&lt;br /&gt;
                output_file.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        p, q, r = map(int, line)&lt;br /&gt;
&lt;br /&gt;
    if not check_restrictions(n, m, edges, p, q, r):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    graph = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
    for edge in edges:&lt;br /&gt;
        u, v = edge&lt;br /&gt;
        graph[u].append(v)&lt;br /&gt;
        graph[v].append(u)&lt;br /&gt;
&lt;br /&gt;
    paths = generate_paths(graph, p, q, r, n)&lt;br /&gt;
    unique_paths = [list(item) for item in set(tuple(path) for path in paths)]&lt;br /&gt;
    unique_paths.sort()&lt;br /&gt;
&lt;br /&gt;
    with open(&#039;lanturi1OUT.txt&#039;, &#039;w&#039;) as output_file:&lt;br /&gt;
        for path in unique_paths:&lt;br /&gt;
            output_file.write(&amp;quot; &amp;quot;.join(map(str, path)) + &amp;quot;\n&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>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0476_-_Lanturi&amp;diff=8722</id>
		<title>0476 - Lanturi</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0476_-_Lanturi&amp;diff=8722"/>
		<updated>2023-12-30T13:23:44Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și trei vârfuri &amp;lt;code&amp;gt;p q r&amp;lt;/code&amp;gt;. Să se determine toate lanțurile elementare cu extremitățile în &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; care conțin vârful &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;.  = Date de intrare = Fişierul de intrare &amp;lt;code&amp;gt;lanturiIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în co...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și trei vârfuri &amp;lt;code&amp;gt;p q r&amp;lt;/code&amp;gt;. Să se determine toate lanțurile elementare cu extremitățile în &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; care conțin vârful &amp;lt;code&amp;gt;r&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;lanturiIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține câte o pereche de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există muchie între &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Următoarea linie conține trei numere &amp;lt;code&amp;gt;p q r&amp;lt;/code&amp;gt;, cu semnificația precizată.&lt;br /&gt;
&lt;br /&gt;
= Date de ieşire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;lanturiOUT.txt&amp;lt;/code&amp;gt; va conține, în ordine lexicografică, toate lanțurile elementare cu extremitățile în &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt;, care conțin vârful &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;, fiecare lanț fiind afișat pe câte o linie a fișierului, vârfurile dintr-un lanț 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 ≤ n ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ i , j ≤n&amp;lt;/code&amp;gt;&lt;br /&gt;
* muchiile se pot repeta în fișierul de intrare&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ p , q , r ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; sunt diferite&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;lanturiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 8&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 2 4 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 2 5 3&lt;br /&gt;
&amp;lt;code&amp;gt;lanturiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 1 3 4 5 &lt;br /&gt;
 2 1 3 5 &lt;br /&gt;
 2 1 4 3 5 &lt;br /&gt;
 2 4 1 3 5 &lt;br /&gt;
 2 4 3 5 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;lanturiIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100 100&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 2 4 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 2 5 3&lt;br /&gt;
&amp;lt;code&amp;gt;lanturiOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Nu corespunde 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 gaseste_lanturi_elementare(graph, p, q, r):&lt;br /&gt;
    def dfs(curent, cale):&lt;br /&gt;
        nonlocal rezultat&lt;br /&gt;
        vizitat[curent] = True&lt;br /&gt;
        cale.append(curent)&lt;br /&gt;
&lt;br /&gt;
        if curent == q:&lt;br /&gt;
            if r in cale:&lt;br /&gt;
                rezultat.add(tuple(cale))&lt;br /&gt;
        else:&lt;br /&gt;
            for vecin in graph[curent]:&lt;br /&gt;
                if not vizitat[vecin]:&lt;br /&gt;
                    dfs(vecin, cale)&lt;br /&gt;
&lt;br /&gt;
        vizitat[curent] = False&lt;br /&gt;
        cale.pop()&lt;br /&gt;
&lt;br /&gt;
    rezultat = set()&lt;br /&gt;
    vizitat = [False] * (n + 1)&lt;br /&gt;
    dfs(p, [])&lt;br /&gt;
&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, p, q, r):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 20) or not (1 &amp;lt;= p &amp;lt;= n) or not (1 &amp;lt;= q &amp;lt;= n) or not (1 &amp;lt;= r &amp;lt;= n) or p == q or p == r or q == r:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def citeste_intrare(nume_fisier):&lt;br /&gt;
    with open(nume_fisier, &#039;r&#039;) as fisier:&lt;br /&gt;
        try:&lt;br /&gt;
            n, m = map(int, fisier.readline().split())&lt;br /&gt;
            graf = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
&lt;br /&gt;
            for _ in range(m):&lt;br /&gt;
                linie = fisier.readline().split()&lt;br /&gt;
                if len(linie) != 2:&lt;br /&gt;
                    raise ValueError(&amp;quot;Nu corespunde restrictiilor impuse&amp;quot;)&lt;br /&gt;
                i, j = map(int, linie)&lt;br /&gt;
                graf[i].append(j)&lt;br /&gt;
                graf[j].append(i)&lt;br /&gt;
&lt;br /&gt;
            linie = fisier.readline().split()&lt;br /&gt;
            if len(linie) != 3:&lt;br /&gt;
                raise ValueError(&amp;quot;Nu corespunde restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            p, q, r = map(int, linie)&lt;br /&gt;
&lt;br /&gt;
            if not (1 &amp;lt;= p &amp;lt;= n) or not (1 &amp;lt;= q &amp;lt;= n) or not (1 &amp;lt;= r &amp;lt;= n) or p == q or p == r or q == r:&lt;br /&gt;
                raise ValueError(&amp;quot;Nu corespunde restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except ValueError as e:&lt;br /&gt;
            with open(&#039;lanturiOUT.txt&#039;, &#039;w&#039;) as fisier_iesire:&lt;br /&gt;
                fisier_iesire.write(f&amp;quot;Nu corespunde restrictiilor impuse&amp;quot;)&lt;br /&gt;
            exit()&lt;br /&gt;
&lt;br /&gt;
    return n, graf, p, q, r&lt;br /&gt;
&lt;br /&gt;
def scrie_iesire(nume_fisier, lanturi):&lt;br /&gt;
    with open(nume_fisier, &#039;w&#039;) as fisier:&lt;br /&gt;
        if lanturi == &amp;quot;Nu corespunde restricțiilor impuse&amp;quot;:&lt;br /&gt;
            fisier.write(lanturi)&lt;br /&gt;
        else:&lt;br /&gt;
            for lant in lanturi:&lt;br /&gt;
                fisier.write(&#039; &#039;.join(map(str, lant)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    fisier_intrare = &#039;lanturiIN.txt&#039;&lt;br /&gt;
    fisier_iesire = &#039;lanturiOUT.txt&#039;&lt;br /&gt;
&lt;br /&gt;
    n, graf, p, q, r = citeste_intrare(fisier_intrare)&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restrictii(n, p, q, r):&lt;br /&gt;
        scrie_iesire(fisier_iesire, &amp;quot;Nu corespunde restrictiilor impuse&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        lanturi = gaseste_lanturi_elementare(graf, p, q, r)&lt;br /&gt;
        lanturi = [list(lant) for lant in lanturi]&lt;br /&gt;
        lanturi.sort()&lt;br /&gt;
&lt;br /&gt;
        scrie_iesire(fisier_iesire, lanturi)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0479_-_Lant_Maxim&amp;diff=8717</id>
		<title>0479 - Lant Maxim</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0479_-_Lant_Maxim&amp;diff=8717"/>
		<updated>2023-12-30T13:00:53Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și două vârfuri &amp;lt;code&amp;gt;p q&amp;lt;/code&amp;gt;. Să se determine cel mai lung lanț elementar cu extremitățile &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt;.  = Date de intrare = Fişierul de intrare &amp;lt;code&amp;gt;lantmaximIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și două vârfuri &amp;lt;code&amp;gt;p q&amp;lt;/code&amp;gt;. Să se determine cel mai lung lanț elementar cu extremitățile &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&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;lantmaximIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține câte o pereche de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există muchie între &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Următoarea linie conține două numere &amp;lt;code&amp;gt;p q&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;lantmaximOUT.txt&amp;lt;/code&amp;gt; va conține cel mai lung lanț elementar cu extremitățile &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt;, vârfurile sale fiind separate prin exact un spațiu. Dacă sunt mai multe lanțuri de lungime maximă, se va afișa primul în ordine lexicografică.Î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 ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ i , j ≤n&amp;lt;/code&amp;gt;&lt;br /&gt;
* muchiile se pot repeta în fișierul de intrare&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ p , q ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* pentru toate datele de test, va exista cel puțin un lanț cu extremitățile &amp;lt;code&amp;gt;p q&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;lantmaximIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 7&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 2 5&lt;br /&gt;
&amp;lt;code&amp;gt;lantmaximOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 1 3 4 5 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;lantmaximIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 100 100&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 2 5&lt;br /&gt;
&amp;lt;code&amp;gt;lantmaximOUT.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_graf(filename):&lt;br /&gt;
    with open(filename, &#039;r&#039;) as file:&lt;br /&gt;
        try:&lt;br /&gt;
            n, m = map(int, file.readline().split())&lt;br /&gt;
            graf = {}&lt;br /&gt;
            muchii = []&lt;br /&gt;
            for _ in range(m):&lt;br /&gt;
                i, j = map(int, file.readline().split())&lt;br /&gt;
                muchii.append((i, j))&lt;br /&gt;
                if i not in graf:&lt;br /&gt;
                    graf[i] = []&lt;br /&gt;
                if j not in graf:&lt;br /&gt;
                    graf[j] = []&lt;br /&gt;
                graf[i].append(j)&lt;br /&gt;
                graf[j].append(i)&lt;br /&gt;
            p, q = map(int, file.readline().split())&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            return None, None, None, None, None, None&lt;br /&gt;
&lt;br /&gt;
    return n, m, muchii, graf, p, q&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, m, muchii, p, q):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 20):&lt;br /&gt;
        return False&lt;br /&gt;
    for i, j in muchii:&lt;br /&gt;
        if not (1 &amp;lt;= i &amp;lt;= n) or not (1 &amp;lt;= j &amp;lt;= n):&lt;br /&gt;
            return False&lt;br /&gt;
    if not (1 &amp;lt;= p &amp;lt;= n) or not (1 &amp;lt;= q &amp;lt;= n):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def dfs(graf, start, end, path, visited, results):&lt;br /&gt;
    visited[start] = True&lt;br /&gt;
    path.append(start)&lt;br /&gt;
&lt;br /&gt;
    if start == end:&lt;br /&gt;
        results.append(path.copy())&lt;br /&gt;
&lt;br /&gt;
    for neighbor in graf[start]:&lt;br /&gt;
        if not visited[neighbor]:&lt;br /&gt;
            dfs(graf, neighbor, end, path, visited, results)&lt;br /&gt;
&lt;br /&gt;
    path.pop()&lt;br /&gt;
    visited[start] = False&lt;br /&gt;
&lt;br /&gt;
def lanț_maxim(filename_in, filename_out):&lt;br /&gt;
    n, m, muchii, graf, p, q = citeste_graf(filename_in)&lt;br /&gt;
    &lt;br /&gt;
    if n is None:&lt;br /&gt;
        with open(filename_out, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restrictii(n, m, muchii, p, q):&lt;br /&gt;
        with open(filename_out, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    visited = {v: False for v in graf}&lt;br /&gt;
    results = []&lt;br /&gt;
&lt;br /&gt;
    dfs(graf, p, q, [], visited, results)&lt;br /&gt;
&lt;br /&gt;
    if results:&lt;br /&gt;
        results.sort()&lt;br /&gt;
        result = results[0]&lt;br /&gt;
&lt;br /&gt;
        with open(filename_out, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(&#039; &#039;.join(map(str, result)))&lt;br /&gt;
    else:&lt;br /&gt;
        with open(filename_out, &#039;w&#039;) as file:&lt;br /&gt;
            file.write(&amp;quot;Nu există lanț între vârfurile date&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Apelul funcției pentru datele din fișierul de intrare lantmaximIN.txt și scrierea rezultatului în lantmaximOUT.txt&lt;br /&gt;
lanț_maxim(&amp;quot;lantmaximIN.txt&amp;quot;, &amp;quot;lantmaximOUT.txt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4152_-_Lant_Maxim_1&amp;diff=8714</id>
		<title>4152 - Lant Maxim 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4152_-_Lant_Maxim_1&amp;diff=8714"/>
		<updated>2023-12-30T12:50:44Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și un vârf &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt;. Să se determine cel mai lung lanț elementar cu extremitatea finală în &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt;.  = Date de intrare = Fişierul de intrare &amp;lt;code&amp;gt;lantmaxim1IN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; li...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și un vârf &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt;. Să se determine cel mai lung lanț elementar cu extremitatea finală în &amp;lt;code&amp;gt;q&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;lantmaxim1IN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține câte o pereche de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există muchie între &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Următoarea linie conține numărul &amp;lt;code&amp;gt;q&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;lantmaxim1OUT.txt&amp;lt;/code&amp;gt; va conține cel mai lung lanț elementar cu extremitățile &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt;, vârfurile sale fiind separate prin exact un spațiu. Dacă sunt mai multe lanțuri de lungime maximă, se va afișa primul în ordine lexicografică.Î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 ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ i , j ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ q ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;lantmaxim1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 6&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 1 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 5&lt;br /&gt;
&amp;lt;code&amp;gt;lantmaxim1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 1 3 4 5 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;lantmaxim1IN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 21 21&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 1 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 5&lt;br /&gt;
&amp;lt;code&amp;gt;lantmaxim1OUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 Nu corespunde 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, muchii, q):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 20):&lt;br /&gt;
        return False&lt;br /&gt;
    for u, v in muchii:&lt;br /&gt;
        if not (1 &amp;lt;= u &amp;lt;= n) or not (1 &amp;lt;= v &amp;lt;= n):&lt;br /&gt;
            return False&lt;br /&gt;
    if not (1 &amp;lt;= q &amp;lt;= n):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def gestionare_restrictii(file_path_out):&lt;br /&gt;
    with open(file_path_out, &#039;w&#039;) as file_out:&lt;br /&gt;
        file_out.write(&amp;quot;Nu corespunde restrictiilor impuse&amp;quot;)&lt;br /&gt;
    exit()&lt;br /&gt;
&lt;br /&gt;
def citeste_graf(file_path):&lt;br /&gt;
    with open(file_path, &#039;r&#039;) as file:&lt;br /&gt;
        n, m = map(int, file.readline().split())&lt;br /&gt;
        muchii = [tuple(map(int, file.readline().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            q = int(file.readline())&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            gestionare_restrictii(&amp;quot;lantmaxim1OUT.txt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restrictii(n, muchii, q):&lt;br /&gt;
        gestionare_restrictii(&amp;quot;lantmaxim1OUT.txt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    return n, muchii, q&lt;br /&gt;
&lt;br /&gt;
def dfs_lant_maxim(q, graf, vizitat, path, lant_maxim):&lt;br /&gt;
    vizitat[q] = True&lt;br /&gt;
    path.append(q)&lt;br /&gt;
&lt;br /&gt;
    for vecin in graf[q]:&lt;br /&gt;
        if not vizitat[vecin]:&lt;br /&gt;
            dfs_lant_maxim(vecin, graf, vizitat, path, lant_maxim)&lt;br /&gt;
&lt;br /&gt;
    if len(path) &amp;gt;= len(lant_maxim):&lt;br /&gt;
        lant_maxim.clear()&lt;br /&gt;
        lant_maxim.extend(path)&lt;br /&gt;
&lt;br /&gt;
    path.pop()&lt;br /&gt;
    vizitat[q] = False&lt;br /&gt;
&lt;br /&gt;
def lungime_lant(q, graf, vizitat):&lt;br /&gt;
    lant_maxim = []&lt;br /&gt;
    dfs_lant_maxim(q, graf, vizitat, [], lant_maxim)&lt;br /&gt;
    return len(lant_maxim), lant_maxim&lt;br /&gt;
&lt;br /&gt;
def gaseste_lant_maxim(n, muchii, q):&lt;br /&gt;
    graf = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
    for u, v in muchii:&lt;br /&gt;
        graf[u].append(v)&lt;br /&gt;
        graf[v].append(u)&lt;br /&gt;
&lt;br /&gt;
    vizitat = {i: False for i in range(1, n + 1)}&lt;br /&gt;
&lt;br /&gt;
    lungime_maxima = 0&lt;br /&gt;
    lant_maxim = []&lt;br /&gt;
&lt;br /&gt;
    for v in range(1, n + 1):&lt;br /&gt;
        if not vizitat[v]:&lt;br /&gt;
            lungime, lant = lungime_lant(v, graf, vizitat)&lt;br /&gt;
            if lungime &amp;gt; lungime_maxima:&lt;br /&gt;
                lungime_maxima = lungime&lt;br /&gt;
                lant_maxim = lant&lt;br /&gt;
&lt;br /&gt;
    return lant_maxim&lt;br /&gt;
&lt;br /&gt;
def scrie_lant_maxim(file_path, lant_maxim):&lt;br /&gt;
    with open(file_path, &#039;w&#039;) as file:&lt;br /&gt;
        file.write(&#039; &#039;.join(map(str, lant_maxim)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    file_in = &amp;quot;lantmaxim1IN.txt&amp;quot;&lt;br /&gt;
    file_out = &amp;quot;lantmaxim1OUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    n, muchii, q = citeste_graf(file_in)&lt;br /&gt;
    lant_maxim = gaseste_lant_maxim(n, muchii, q)&lt;br /&gt;
&lt;br /&gt;
    if lant_maxim:&lt;br /&gt;
        scrie_lant_maxim(file_out, lant_maxim)&lt;br /&gt;
    else:&lt;br /&gt;
        with open(file_out, &#039;w&#039;) as file_out:&lt;br /&gt;
            file_out.write(&amp;quot;Nu corespunde restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0475_-_Lant&amp;diff=8711</id>
		<title>0475 - Lant</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0475_-_Lant&amp;diff=8711"/>
		<updated>2023-12-30T12:45:22Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și două vârfuri &amp;lt;code&amp;gt;p q&amp;lt;/code&amp;gt;. Să se determine toate lanțurile elementare cu extremitățile &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt;.  = Date de intrare = Fişierul de intrare &amp;lt;code&amp;gt;lantIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și două vârfuri &amp;lt;code&amp;gt;p q&amp;lt;/code&amp;gt;. Să se determine toate lanțurile elementare cu extremitățile &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;q&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;lantIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține câte o pereche de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există muchie între &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Următoarea linie conține două numere &amp;lt;code&amp;gt;p q&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;lantOUT.txt&amp;lt;/code&amp;gt; va conține, în ordine lexicografică, toate lanțurile elementare cu extremitățile în &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;, respectiv &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt;, fiecare lanț fiind afișat pe câte o linie a fișierului, vârfurile dintr-un lanț 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 ≤ n ≤ 20&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ i , j ≤n&amp;lt;/code&amp;gt;&lt;br /&gt;
* muchiile se pot repeta în fișierul de intrare&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ p , q ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;lantIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 8&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 2 4 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 2 5&lt;br /&gt;
&amp;lt;code&amp;gt;lantOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 2 1 3 4 5 &lt;br /&gt;
 2 1 3 5 &lt;br /&gt;
 2 1 4 3 5 &lt;br /&gt;
 2 1 4 5 &lt;br /&gt;
 2 4 1 3 5 &lt;br /&gt;
 2 4 3 5 &lt;br /&gt;
 2 4 5 &lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;lantIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1000 100&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 2 4 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 2 5&lt;br /&gt;
&amp;lt;code&amp;gt;lantOUT.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, muchii, p, q):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 20):&lt;br /&gt;
        return False&lt;br /&gt;
    for u, v in muchii:&lt;br /&gt;
        if not (1 &amp;lt;= u &amp;lt;= n) or not (1 &amp;lt;= v &amp;lt;= n):&lt;br /&gt;
            return False&lt;br /&gt;
    if not (1 &amp;lt;= p &amp;lt;= n) or not (1 &amp;lt;= q &amp;lt;= n):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def citeste_graf(file_path):&lt;br /&gt;
    with open(file_path, &#039;r&#039;) as file:&lt;br /&gt;
        n, m = map(int, file.readline().split())&lt;br /&gt;
        muchii = [tuple(map(int, file.readline().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            p, q = map(int, file.readline().split())&lt;br /&gt;
        except ValueError:&lt;br /&gt;
            with open(&amp;quot;lantOUT.txt&amp;quot;, &#039;w&#039;) as file_out:&lt;br /&gt;
                file_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
            exit()&lt;br /&gt;
&lt;br /&gt;
    if not verifica_restrictii(n, muchii, p, q):&lt;br /&gt;
        with open(&amp;quot;lantOUT.txt&amp;quot;, &#039;w&#039;) as file_out:&lt;br /&gt;
            file_out.write(&amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
    return n, muchii, p, q&lt;br /&gt;
&lt;br /&gt;
def dfs(v, tinta, graf, vizitat, path, rezultat):&lt;br /&gt;
    vizitat[v] = True&lt;br /&gt;
    path.append(v)&lt;br /&gt;
&lt;br /&gt;
    if v == tinta:&lt;br /&gt;
        rezultat.append(path.copy())&lt;br /&gt;
    else:&lt;br /&gt;
        for vecin in graf[v]:&lt;br /&gt;
            if not vizitat[vecin]:&lt;br /&gt;
                dfs(vecin, tinta, graf, vizitat, path, rezultat)&lt;br /&gt;
&lt;br /&gt;
    path.pop()&lt;br /&gt;
    vizitat[v] = False&lt;br /&gt;
&lt;br /&gt;
def gaseste_lanturi(n, muchii, p, q):&lt;br /&gt;
    graf = {i: [] for i in range(1, n + 1)}&lt;br /&gt;
    for u, v in muchii:&lt;br /&gt;
        graf[u].append(v)&lt;br /&gt;
        graf[v].append(u)&lt;br /&gt;
&lt;br /&gt;
    vizitat = {i: False for i in range(1, n + 1)}&lt;br /&gt;
    rezultat = []&lt;br /&gt;
&lt;br /&gt;
    dfs(p, q, graf, vizitat, [], rezultat)&lt;br /&gt;
&lt;br /&gt;
    rezultat = list(set(tuple(lant) for lant in rezultat))&lt;br /&gt;
    rezultat.sort()&lt;br /&gt;
&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
def scrie_lanturi(file_path, lanturi):&lt;br /&gt;
    with open(file_path, &#039;w&#039;) as file:&lt;br /&gt;
        for lant in lanturi:&lt;br /&gt;
            file.write(&#039; &#039;.join(map(str, lant)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    file_in = &amp;quot;lantIN.txt&amp;quot;&lt;br /&gt;
    file_out = &amp;quot;lantOUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    n, muchii, p, q = citeste_graf(file_in)&lt;br /&gt;
    rezultat = gaseste_lanturi(n, muchii, p, q)&lt;br /&gt;
    scrie_lanturi(file_out, rezultat)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0474_-_Verif_Lant&amp;diff=8709</id>
		<title>0474 - Verif Lant</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0474_-_Verif_Lant&amp;diff=8709"/>
		<updated>2023-12-30T12:37:10Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerinţa = Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și mai multe șiruri de vârfuri din graf. Să se verifice despre fiecare șir dacă reprezintă un lanț. În caz afirmativ, să se precizeze dacă este elementar.  = Date de intrare = Fişierul de intrare &amp;lt;code&amp;gt;veriflantIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerinţa =&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; vârfuri și mai multe șiruri de vârfuri din graf. Să se verifice despre fiecare șir dacă reprezintă un lanț. În caz afirmativ, să se precizeze dacă este elementar.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fişierul de intrare &amp;lt;code&amp;gt;veriflantIN.txt&amp;lt;/code&amp;gt; conţine pe prima linie numerele &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; linii conține câte o pereche de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt;, cu semnificația că există muchie între &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Urmează numărul de șiruri &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;. Pentru fiecare șir se dă numărul de vârfuri și apoi vârfurile.&lt;br /&gt;
&lt;br /&gt;
= Date de ieşire =&lt;br /&gt;
Fişierul de ieşire &amp;lt;code&amp;gt;veriflantOUT.txt&amp;lt;/code&amp;gt; va conține &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; linii. Fiecare linie va contine unul dintre cuvintele &amp;lt;code&amp;gt;NU&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ELEMENTAR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NEELEMENTAR&amp;lt;/code&amp;gt;, după cum șirul de vârfuri corespunzător nu formează lanț, formează lanț elementar, respectiv formează lanț neelementar.Î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 ≤ i , j ≤ n&amp;lt;/code&amp;gt;&lt;br /&gt;
* muchiile se pot repeta în fișierul de intrare&lt;br /&gt;
* &amp;lt;code&amp;gt;1 ≤ k ≤ 100&amp;lt;/code&amp;gt;&lt;br /&gt;
* lungimea fiecărui șir dat este mai mică decât &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;veriflantIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 5 8&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 2 4 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 3&lt;br /&gt;
 5 1 2 3 4 5&lt;br /&gt;
 4 2 4 5 3&lt;br /&gt;
 5 2 4 3 4 5&lt;br /&gt;
&amp;lt;code&amp;gt;veriflantOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 NU&lt;br /&gt;
 ELEMENTAR&lt;br /&gt;
 NEELEMENTAR&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;veriflantIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001 100&lt;br /&gt;
 1 4 &lt;br /&gt;
 1 3 &lt;br /&gt;
 3 5 &lt;br /&gt;
 4 5 &lt;br /&gt;
 2 4 &lt;br /&gt;
 1 2 &lt;br /&gt;
 4 2 &lt;br /&gt;
 3 4&lt;br /&gt;
 3&lt;br /&gt;
 5 1 2 3 4 5&lt;br /&gt;
 4 2 4 5 3&lt;br /&gt;
 5 2 4 3 4 5&lt;br /&gt;
&amp;lt;code&amp;gt;veriflantOUT.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 citire_graf(muchii):&lt;br /&gt;
    graf = {}&lt;br /&gt;
    for i, j in muchii:&lt;br /&gt;
        if i not in graf:&lt;br /&gt;
            graf[i] = []&lt;br /&gt;
        if j not in graf:&lt;br /&gt;
            graf[j] = []&lt;br /&gt;
        graf[i].append(j)&lt;br /&gt;
        graf[j].append(i)&lt;br /&gt;
    return graf&lt;br /&gt;
&lt;br /&gt;
def este_lant(graf, sir):&lt;br /&gt;
    for i in range(len(sir) - 1):&lt;br /&gt;
        if sir[i + 1] not in graf[sir[i]]:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def este_elementar(sir):&lt;br /&gt;
    return len(set(sir)) == len(sir)&lt;br /&gt;
&lt;br /&gt;
def verifica_restrictii(n, muchii, k, vrf_siruri):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    for i, j in muchii:&lt;br /&gt;
        if not (1 &amp;lt;= i &amp;lt;= n and 1 &amp;lt;= j &amp;lt;= n):&lt;br /&gt;
            return False&lt;br /&gt;
    if not (1 &amp;lt;= k &amp;lt;= 100):&lt;br /&gt;
        return False&lt;br /&gt;
    for sir in vrf_siruri:&lt;br /&gt;
        if not (len(sir) &amp;lt; 200):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
# Deschideți fișierele de intrare și ieșire&lt;br /&gt;
with open(&amp;quot;veriflantIN.txt&amp;quot;, &amp;quot;r&amp;quot;) as input_file, open(&amp;quot;veriflantOUT.txt&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
    n, m = map(int, input_file.readline().split())&lt;br /&gt;
    muchii = [tuple(map(int, input_file.readline().split())) for _ in range(m)]&lt;br /&gt;
&lt;br /&gt;
    try:&lt;br /&gt;
        k = int(input_file.readline())&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        output_file.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
    vrf_siruri = [list(map(int, input_file.readline().split()[1:])) for _ in range(k)]&lt;br /&gt;
&lt;br /&gt;
    if verifica_restrictii(n, muchii, k, vrf_siruri):&lt;br /&gt;
        graf = citire_graf(muchii)&lt;br /&gt;
        for vrf_sir in vrf_siruri:&lt;br /&gt;
            if este_lant(graf, vrf_sir):&lt;br /&gt;
                if este_elementar(vrf_sir):&lt;br /&gt;
                    output_file.write(&amp;quot;ELEMENTAR\n&amp;quot;)&lt;br /&gt;
                else:&lt;br /&gt;
                    output_file.write(&amp;quot;NEELEMENTAR\n&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                output_file.write(&amp;quot;NU\n&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        output_file.write(&amp;quot;Datele nu corespund restrictiilor impuse\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0598_-_Gears&amp;diff=8598</id>
		<title>0598 - Gears</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0598_-_Gears&amp;diff=8598"/>
		<updated>2023-12-27T20:53:27Z</updated>

		<summary type="html">&lt;p&gt;Rus Marius: Pagină nouă: = Cerința = Considerăm un ansamblu format din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; roți dințate, numerotate 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;, ca în imaginea alăturată. Fiecare roată se poate roti spre dreapta sau spre stânga. Dacă o roată se rotește spre dreapta, toate roțile pe care le angrenează se vor roti spre stânga, și invers.  Una dintre roți este conectată la un motor și se va roti spre dreapta, iar toate roțile din ansamblu se vor roti în mod corespunzător. Ans...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Cerința =&lt;br /&gt;
Considerăm un ansamblu format din &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; roți dințate, numerotate 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;, ca în imaginea alăturată. Fiecare roată se poate roti spre dreapta sau spre stânga. Dacă o roată se rotește spre dreapta, toate roțile pe care le angrenează se vor roti spre stânga, și invers.&lt;br /&gt;
&lt;br /&gt;
Una dintre roți este conectată la un motor și se va roti spre dreapta, iar toate roțile din ansamblu se vor roti în mod corespunzător. Ansamblul este construit astfel încât toate roțile vor fi angrenate și fiecare roată va fi angrenată de o unică altă roată.&lt;br /&gt;
&lt;br /&gt;
Dându-se numărul de roți &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;, numărul de ordine &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; al roții conectate la motor și perechile de roți conectate între ele, să se determine sensul de rotație al fiecărei roți.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;gearsIN.txt&amp;lt;/code&amp;gt; conține pe prima linie numerele &amp;lt;code&amp;gt;n x&amp;lt;/code&amp;gt;. Următoarele &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; linii vor conține perechi de numere &amp;lt;code&amp;gt;i j&amp;lt;/code&amp;gt; reprezentând perechi de roți conectate.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;gearsOUT.txt&amp;lt;/code&amp;gt; va conține pe prima linie un șir de &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; caractere: &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; sau &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, după cum roata corespunzătoare se rotește spre stânga, respectiv dreapta. Î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;
&lt;br /&gt;
= Exemplul 1: =&lt;br /&gt;
&amp;lt;code&amp;gt;gearsIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 4&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 4&lt;br /&gt;
 1 5&lt;br /&gt;
 3 6&lt;br /&gt;
 3 7&lt;br /&gt;
&amp;lt;code&amp;gt;gearsOUT.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 SDDDDSS&lt;br /&gt;
&lt;br /&gt;
= Exemplul 2: =&lt;br /&gt;
&amp;lt;code&amp;gt;gearsIN.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
 1001 23&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 4&lt;br /&gt;
 1 5&lt;br /&gt;
 3 6&lt;br /&gt;
 3 7&lt;br /&gt;
&amp;lt;code&amp;gt;gearsOUT.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;
        return False&lt;br /&gt;
&lt;br /&gt;
def citeste_intrare(nume_fisier):&lt;br /&gt;
    with open(nume_fisier, &#039;r&#039;) as fisier:&lt;br /&gt;
        n, x = map(int, fisier.readline().split())&lt;br /&gt;
        conexiuni = [tuple(map(int, linie.split())) for linie in fisier.readlines()]&lt;br /&gt;
    return n, x, conexiuni&lt;br /&gt;
&lt;br /&gt;
def scrie_iesire(nume_fisier, rezultat):&lt;br /&gt;
    with open(nume_fisier, &#039;w&#039;) as fisier:&lt;br /&gt;
        fisier.write(rezultat)&lt;br /&gt;
&lt;br /&gt;
def directii_rotire(n, x, conexiuni):&lt;br /&gt;
    graf = {i: {&#039;directie&#039;: &#039;S&#039;} for i in range(1, n+1)}&lt;br /&gt;
    graf[x][&#039;directie&#039;] = &#039;D&#039;&lt;br /&gt;
&lt;br /&gt;
    for conexiune in conexiuni:&lt;br /&gt;
        i, j = conexiune&lt;br /&gt;
        if graf[i][&#039;directie&#039;] == &#039;S&#039;:&lt;br /&gt;
            graf[j][&#039;directie&#039;] = &#039;D&#039;&lt;br /&gt;
        else:&lt;br /&gt;
            graf[j][&#039;directie&#039;] = &#039;S&#039;&lt;br /&gt;
&lt;br /&gt;
    return &#039;&#039;.join(graf[i][&#039;directie&#039;] for i in range(1, n+1))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    fisier_intrare = &amp;quot;gearsIN.txt&amp;quot;&lt;br /&gt;
    fisier_iesire = &amp;quot;gearsOUT.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    n, x, conexiuni = citeste_intrare(fisier_intrare)&lt;br /&gt;
&lt;br /&gt;
    if verifica_restrictii(n):&lt;br /&gt;
        rezultat = directii_rotire(n, x, conexiuni)&lt;br /&gt;
        scrie_iesire(fisier_iesire, rezultat)&lt;br /&gt;
    else:&lt;br /&gt;
        scrie_iesire(fisier_iesire, &amp;quot;Datele nu corespund restrictiilor impuse&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rus Marius</name></author>
	</entry>
</feed>