<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=0472_-_Bipartit_1</id>
	<title>0472 - Bipartit 1 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=0472_-_Bipartit_1"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0472_-_Bipartit_1&amp;action=history"/>
	<updated>2026-05-01T06:41:09Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0472_-_Bipartit_1&amp;diff=8696&amp;oldid=prev</id>
		<title>AntalKrisztian: Pagină nouă: == Cerinţa == Se dă lista muchiilor unui graf neorientat cu &#039;&#039;&#039;n&#039;&#039;&#039; vârfuri, etichetate de la &#039;&#039;&#039;1&#039;&#039;&#039; la &#039;&#039;&#039;n&#039;&#039;&#039;. Să se verifice dacă graful este bipartit. == Date de intrare == Fişierul de intrare &#039;&#039;&#039;bipartit1in.txt&#039;&#039;&#039; conţine pe prima linie numerele &#039;&#039;&#039;n&#039;&#039;&#039; și &#039;&#039;&#039;m&#039;&#039;&#039;, reprezentând numărul de vârfuri ale grafului și numărul de muchii. Fiecare dintre următoarele &#039;&#039;&#039;m&#039;&#039;&#039; linii conține câte o pereche de numere &#039;&#039;&#039;i j&#039;&#039;&#039;, cu semnificația că există muchie înt...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0472_-_Bipartit_1&amp;diff=8696&amp;oldid=prev"/>
		<updated>2023-12-29T18:44:18Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: == Cerinţa == Se dă lista muchiilor unui graf neorientat cu &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; vârfuri, etichetate de la &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; la &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;. Să se verifice dacă graful este bipartit. == Date de intrare == Fişierul de intrare &amp;#039;&amp;#039;&amp;#039;bipartit1in.txt&amp;#039;&amp;#039;&amp;#039; conţine pe prima linie numerele &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;, reprezentând numărul de vârfuri ale grafului și numărul de muchii. Fiecare dintre următoarele &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; linii conține câte o pereche de numere &amp;#039;&amp;#039;&amp;#039;i j&amp;#039;&amp;#039;&amp;#039;, cu semnificația că există muchie înt...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; vârfuri, etichetate de la &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; la &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;. Să se verifice dacă graful este bipartit.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare &amp;#039;&amp;#039;&amp;#039;bipartit1in.txt&amp;#039;&amp;#039;&amp;#039; conţine pe prima linie numerele &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;, reprezentând numărul de vârfuri ale grafului și numărul de muchii. Fiecare dintre următoarele &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; linii conține câte o pereche de numere &amp;#039;&amp;#039;&amp;#039;i j&amp;#039;&amp;#039;&amp;#039;, cu semnificația că există muchie între &amp;#039;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
== Date de ieşire ==&lt;br /&gt;
Fişierul de ieşire &amp;#039;&amp;#039;&amp;#039;bipartit1out.txt&amp;#039;&amp;#039;&amp;#039; va conţine pe prima linie mesajul &amp;#039;&amp;#039;&amp;#039;DA&amp;#039;&amp;#039;&amp;#039;, dacă graful este bipartit, respectiv &amp;#039;&amp;#039;&amp;#039;NU&amp;#039;&amp;#039;&amp;#039; în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Dacă mesajul este &amp;#039;&amp;#039;&amp;#039;DA&amp;#039;&amp;#039;&amp;#039;, următoarele două linii vor conţine două mulţimi care formează partiţia vârfurilor. Elementele fiecărei mulţimi vor fi afişate în ordine crescătoare, separate prin exact un spaţiu. Prima mulţime va fi cea care conţine vârful &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;1 &amp;lt; n &amp;amp;les; 15&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;1 &amp;amp;les; i , j &amp;amp;les; n&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; bipartit1in.txt&lt;br /&gt;
 7 6&lt;br /&gt;
 1 4&lt;br /&gt;
 1 6&lt;br /&gt;
 6 5&lt;br /&gt;
 3 2&lt;br /&gt;
 3 5&lt;br /&gt;
 3 7&lt;br /&gt;
; bipartit1out.txt&lt;br /&gt;
 Datele de intrare corespund restrictiilor impuse.&lt;br /&gt;
 DA&lt;br /&gt;
 1 2 5 7 &lt;br /&gt;
 3 4 6 &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; bipartit1in.txt&lt;br /&gt;
 ijtijgijrigmfg&lt;br /&gt;
; bipartit1out.txt&lt;br /&gt;
 Datele de intrare nu corespund restrictiilor impuse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# Funcția de validare verifică dacă datele de intrare sunt în intervalul specificat&lt;br /&gt;
def validare(n_validare, muchii_validare):&lt;br /&gt;
    # Verificăm dacă n este în intervalul 1-15&lt;br /&gt;
    if n_validare &amp;lt; 1 or n_validare &amp;gt; 15:&lt;br /&gt;
        raise ValueError  # Ridicăm o eroare dacă n nu este în intervalul 1-15&lt;br /&gt;
    for muchie in muchii_validare:  # Parcurgem lista de muchii&lt;br /&gt;
        # Verificăm dacă valoarea absolută a fiecărui vârf este în intervalul 1-n&lt;br /&gt;
        if abs(muchie[0]) &amp;lt; 1 or abs(muchie[0]) &amp;gt; n_validare or abs(muchie[1]) &amp;lt; 1 or abs(muchie[1]) &amp;gt; n_validare:&lt;br /&gt;
            raise ValueError&lt;br /&gt;
    file_out.write(&amp;quot;Datele de intrare corespund restrictiilor impuse.\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția este_bipartit verifică dacă graful este bipartit&lt;br /&gt;
def este_bipartit(n_bipartit, muchii_bipartit):&lt;br /&gt;
    # Inițializăm culorile vârfurilor cu -1&lt;br /&gt;
    culoare_bipartit = [-1] * (n_bipartit + 1)&lt;br /&gt;
    # Construim lista de adiacență a grafului&lt;br /&gt;
    lista_adiacenta = [[] for _ in range(n_bipartit + 1)]&lt;br /&gt;
    for muchie in muchii_bipartit:&lt;br /&gt;
        lista_adiacenta[muchie[0]].append(muchie[1])&lt;br /&gt;
        lista_adiacenta[muchie[1]].append(muchie[0])&lt;br /&gt;
    # Parcurgem vârfurile grafului&lt;br /&gt;
    for i in range(1, n_bipartit + 1):&lt;br /&gt;
        # Dacă vârful nu a fost colorat și nu poate fi colorat, atunci graful nu este bipartit&lt;br /&gt;
        if culoare_bipartit[i] == -1 and not colorare(i, 1, culoare_bipartit, lista_adiacenta):&lt;br /&gt;
            return False, culoare_bipartit&lt;br /&gt;
    return True, culoare_bipartit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția colorare încearcă să coloreze vârfurile grafului astfel încât să fie bipartit&lt;br /&gt;
def colorare(v, c, culoare_color, lista_adiacenta):&lt;br /&gt;
    # Colorăm vârful v cu culoarea c&lt;br /&gt;
    culoare_color[v] = c&lt;br /&gt;
    # Parcurgem vecinii vârfului v&lt;br /&gt;
    for u in lista_adiacenta[v]:&lt;br /&gt;
        # Dacă vecinul u are aceeași culoare cu v, atunci graful nu poate fi bipartit&lt;br /&gt;
        if culoare_color[u] == c:&lt;br /&gt;
            return False&lt;br /&gt;
        # Dacă vecinul u nu a fost colorat și nu poate fi colorat, atunci graful nu poate fi bipartit&lt;br /&gt;
        if culoare_color[u] == -1 and not colorare(u, 1 - c, culoare_color, lista_adiacenta):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    file_in = open(&amp;quot;bipartit1in.txt&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
    file_out = open(&amp;quot;bipartit1out.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    try:&lt;br /&gt;
        # Citim numărul de vârfuri și de muchii&lt;br /&gt;
        n_main, m_main = map(int, file_in.readline().split())&lt;br /&gt;
        # Citim muchiile&lt;br /&gt;
        muchii_main = [list(map(int, linie.split())) for linie in file_in.readlines()]&lt;br /&gt;
        # Validăm datele de intrare&lt;br /&gt;
        validare(n_main, muchii_main)&lt;br /&gt;
        # Verificăm dacă graful este bipartit&lt;br /&gt;
        bipartit, culoare = este_bipartit(n_main, muchii_main)&lt;br /&gt;
        if bipartit:&lt;br /&gt;
            file_out.write(&amp;quot;DA\n&amp;quot;)&lt;br /&gt;
            # Construim listele de vârfuri pentru cele două mulțimi&lt;br /&gt;
            lista1 = [i for i in range(1, n_main + 1) if culoare[i] == 1]&lt;br /&gt;
            lista2 = [i for i in range(1, n_main + 1) if culoare[i] == 0]&lt;br /&gt;
            file_out.write(&amp;#039; &amp;#039;.join(map(str, lista1)) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
            file_out.write(&amp;#039; &amp;#039;.join(map(str, lista2)) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            file_out.write(&amp;quot;NU\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Dacă datele de intrare nu sunt valide, afișăm un mesaj de eroare&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        file_out.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
    # Dacă datele de intrare sunt incomplete, afișăm un mesaj de eroare&lt;br /&gt;
    except IndexError:&lt;br /&gt;
        file_out.write(&amp;quot;Datele de intrare nu corespund restrictiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AntalKrisztian</name></author>
	</entry>
</feed>