<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=Clasa_a_XI-a_lec%C8%9Bia_17</id>
	<title>Clasa a XI-a lecția 17 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=Clasa_a_XI-a_lec%C8%9Bia_17"/>
	<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_17&amp;action=history"/>
	<updated>2026-04-13T19:12:36Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_17&amp;diff=17447&amp;oldid=prev</id>
		<title>Bella at 10:01, 24 February 2020</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_17&amp;diff=17447&amp;oldid=prev"/>
		<updated>2020-02-24T10:01:47Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Graf Bipartit =&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Definiţie:&amp;#039;&amp;#039;&amp;#039; Un graf G=(X, U) se numește graf bipartit dacă există două mulţimi nevide A și B astfel încât X=A ∪ B, A ∩ B = ∅ şi orice muchie u a lui G are o extremitate în A iar cealaltă în B. Mulţimile A şi B formează o partiţie a lui X.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Graful următor este bipartit. A={1,2,5,7} și B={3,4,6}.&lt;br /&gt;
&lt;br /&gt;
[[image:graf-bipartit.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatii:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* orice arbore este bipartit&lt;br /&gt;
* nu orice graf bipartit eate arbore.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Definiție:&amp;#039;&amp;#039;&amp;#039; Un graf bipartit G=(X,U) se numește bipartit complet dacă pentru oricare două vârfuri x∈A și y∈B, există în graf muchia (x,y); adică (x,y)∈U.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Graful următor este bipartit complet.&lt;br /&gt;
&lt;br /&gt;
[[image:graf-bipartit-complet.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Verificarea unui graf bipartit ==&lt;br /&gt;
Putem verifica daca un graf e bipartit in 2 moduri:&lt;br /&gt;
* un graf e bipartit daca putem colora nodurile cu 2 culori, astfel incat fiecare muchie sa aiba capete de culori diferite&lt;br /&gt;
* un graf e bipartit daca nu contine cicluri de lungime para; &lt;br /&gt;
&lt;br /&gt;
[[image:bipartitegraph5.jpg|220px]]&lt;br /&gt;
[[image:bipartitegraph6.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Folosirea Metodei Backtracking  ===&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=472 Bipartit1] ===&lt;br /&gt;
Vom Utiliza metoda backtracking pentru a genera toate modalitatile de partitionare a celor n noduri.&lt;br /&gt;
Vom folosi o stiva pentru a construi o solutie de dimensiune n. Pe stiva vom putea pun doar valori din multimea {1,2}. validarea unei solutii partiale consta in validarea unei valori noi adaugate pe nivelul curent k. Aceasta trebuie sa indeplineasca urmatoarea conditie:&lt;br /&gt;
&lt;br /&gt;
* culoarea nodului k ( 1 sau 2 ) trebuie sa fie diferita de culorile vecinilos sai deja colorati. &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std ;&lt;br /&gt;
&lt;br /&gt;
ifstream fin ( &amp;quot;bipartit1.in&amp;quot; ) ;&lt;br /&gt;
ofstream fout ( &amp;quot;bipartit1.out&amp;quot; ) ;&lt;br /&gt;
&lt;br /&gt;
int a[102][102], st[102];&lt;br /&gt;
int n, m;&lt;br /&gt;
int sol = 0 ;&lt;br /&gt;
&lt;br /&gt;
void afisare (){&lt;br /&gt;
  if ( sol ){&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;DA\n&amp;quot; ;&lt;br /&gt;
    for ( int i = 1 ; i &amp;lt;= n ; i++ )&lt;br /&gt;
      if ( st[i] == 1 )&lt;br /&gt;
        fout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; &amp;quot; ;&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot; ;&lt;br /&gt;
    for ( int i = 1 ; i &amp;lt;= n ; i++ )&lt;br /&gt;
      if ( st[i] == 2 )&lt;br /&gt;
          fout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; &amp;quot; ;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;NU&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
// e valida colorarea nodului k daca vecinii sai deja colorati au luloare diferita de el&lt;br /&gt;
int valid ( int k ){&lt;br /&gt;
  for ( int i = 1 ; i &amp;lt; k ; i++ )&lt;br /&gt;
    if ( st[i] == st[k] &amp;amp;&amp;amp; a[i][k] == 1 )&lt;br /&gt;
      return 0;&lt;br /&gt;
 return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void back ( int k ){&lt;br /&gt;
  if ( k == n + 1 ){&lt;br /&gt;
    sol++;&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  for ( int i = 1 ; i &amp;lt;= 2 &amp;amp;&amp;amp; !sol ; i++ ){&lt;br /&gt;
     st[k] = i ;&lt;br /&gt;
     if ( valid ( k ) )&lt;br /&gt;
       back ( k + 1 ) ;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int main (){&lt;br /&gt;
  fin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m ;&lt;br /&gt;
  for ( int i = 0; i &amp;lt; m ; i++ ){&lt;br /&gt;
    int x , y ;&lt;br /&gt;
    fin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y;&lt;br /&gt;
    a[x][y] = a[y][x] = 1 ;&lt;br /&gt;
  }&lt;br /&gt;
  back ( 1 ) ;&lt;br /&gt;
  afisare();&lt;br /&gt;
 return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Folosirea BFS  ===&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1318 bipartit1mare]====&lt;br /&gt;
Complexitatea de timp e aceeasi cu a algoritmului BFS. In implementarea de mai jos, unde parcugem vecinii memorati intr-o matrice de adiacenta vom avea complexitatea &amp;#039;&amp;#039;&amp;#039;O(n^2)&amp;#039;&amp;#039;&amp;#039; unde n e numarul de noduri. Complexitatea deriva din faptul ca pentru fiecare nod i din multimea celor n, parcurg toatea nodurile de la 1 la n pentru a verifica care noduri sunt vecine cu nodul i. Daca vom reprezenta graful folosind liste de adiacenta vom avea complexitate &amp;#039;&amp;#039;&amp;#039;O(n+2m)&amp;#039;&amp;#039;&amp;#039;, unde n e numarul de noduri iar m numarul de muchii. In listele de adiacenta, parcurgem doar nodurile vecine asociate fiecarui nod. Vom avea 2m vecinatati memorate ( o muchia intre x si y este marcata si in lista lui x si in lista lui y).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin(&amp;quot;bipartit1.in&amp;quot;);&lt;br /&gt;
ofstream fout(&amp;quot;bipartit1.out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
int n, m, i, j, x;&lt;br /&gt;
int a[1001][1001];&lt;br /&gt;
int c[1001];          // coada in care tin nodurile in ordinea vizitarii lor&lt;br /&gt;
int cul[1001];        // marchez daca am vizitat un nod; cand il vizitez il colorez cu 1 si -1&lt;br /&gt;
&lt;br /&gt;
bool BFS( int start, int culoare ){                             // pornim parcurgerea de la un nod dat&lt;br /&gt;
  int i = 1;&lt;br /&gt;
  int vf = 0;&lt;br /&gt;
  cul[start] = culoare; //**                   // marchez ca vizitat nodul start&lt;br /&gt;
  c[++vf] = start;                             // punem in coada nodul de la care pornim&lt;br /&gt;
  while( i &amp;lt;= vf ){                            // cata vreme mai am elemente in coada&lt;br /&gt;
    int nod = c[i];                            // nodul curent&lt;br /&gt;
    //out &amp;lt;&amp;lt; nod &amp;lt;&amp;lt; &amp;quot; &amp;quot;;                       // afisez nodul curent&lt;br /&gt;
    for(int vecin = 1; vecin &amp;lt;= n; vecin++ )   // parcurg toti vecinii nodului curent&lt;br /&gt;
      if( a[nod][vecin] == 1 )&lt;br /&gt;
         if( cul[vecin] == 0 ){                // daca nu e colorat&lt;br /&gt;
            cul[vecin] = -cul[nod]; //**       // colorez diferit fata de nod&lt;br /&gt;
            c[++vf] = vecin;                   // ii pun in coada&lt;br /&gt;
         }&lt;br /&gt;
      else if( cul[vecin] == cul[nod] ) //**   // daca am dat de un vexin deja colorat cu aceeasi culoare cu nod&lt;br /&gt;
        return 0;                              // graful nu e bipartit&lt;br /&gt;
    i++;                                       // trec la urmatorul element din coada&lt;br /&gt;
  }&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  fin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m ;&lt;br /&gt;
  for( int l = 1; l &amp;lt;= m; l++ ){&lt;br /&gt;
    fin &amp;gt;&amp;gt; i &amp;gt;&amp;gt; j;&lt;br /&gt;
    a[i][j] = a[j][i] = 1;&lt;br /&gt;
  }&lt;br /&gt;
  int p = 1;                    &lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    if ( cul[i] == 0 &amp;amp;&amp;amp; p )&lt;br /&gt;
      p = (p &amp;amp;&amp;amp; BFS( i, 1 ));         // apelam bfs pentru fiecare componenta conexa&lt;br /&gt;
  if( p ){                            // daca toate componentele au putut fi colorate&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;DA\n&amp;quot;;                   // graful e bipartit&lt;br /&gt;
    for( int i = 1; i &amp;lt;= n; i++ )     // afisam nodurile colorate cu 1 ( prima multime )&lt;br /&gt;
      if ( cul[i] == 1 )&lt;br /&gt;
        fout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
    for( int i = 1; i &amp;lt;= n; i++ )     // afisam nodurile colorate cu -1 &lt;br /&gt;
      if ( cul[i] == -1 )&lt;br /&gt;
        fout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;NU&amp;quot;;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Folosirea DFS  ===&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1318 bipartit1mare]====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin(&amp;quot;bipartit1mare.in&amp;quot;);&lt;br /&gt;
ofstream fout(&amp;quot;bipartit1mare.out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
int n, m, i, j;&lt;br /&gt;
int a[1001][1001];&lt;br /&gt;
int cul[1001];        // marchez daca am vizitat un nod; cand il vizitez il colorez cu 1 si -1&lt;br /&gt;
int ok = 1;&lt;br /&gt;
void dfs( int nod, int culoare ){&lt;br /&gt;
  //out &amp;lt;&amp;lt; nod &amp;lt;&amp;lt; &amp;quot; &amp;quot;;                    // afisam nodul curent&lt;br /&gt;
  cul[nod] = culoare;                     // marcam nodul curent ca fiind vizitat, colorat&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= n; i++ )          // parcurgem toti vecinii nodului curent&lt;br /&gt;
      if (a[nod][i] == 1 ){&lt;br /&gt;
        if(cul[i] == 0 )                  // daca nodul nu este vizitat&lt;br /&gt;
          dfs( i, -culoare );             // il colorez complementar nodului curent&lt;br /&gt;
        else&lt;br /&gt;
          if( cul[nod] == cul[i] )        // daca a mai fost vizitat, verific sa nu fie colorat la fel ca nodu lcurent&lt;br /&gt;
            ok = 0;                       // in acest caz graful nu e biparti&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  fin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m ;&lt;br /&gt;
  for( int l = 1; l &amp;lt;= m; l++ ){&lt;br /&gt;
    fin &amp;gt;&amp;gt; i &amp;gt;&amp;gt; j;&lt;br /&gt;
    a[i][j] = a[j][i] = 1;&lt;br /&gt;
  }&lt;br /&gt;
  int p = 1;&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    if ( cul[i] == 0 ){&lt;br /&gt;
        ok = 1;&lt;br /&gt;
        dfs( i, 1 );&lt;br /&gt;
        p = ( p &amp;amp;&amp;amp; ok );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  if( p ){                            // daca toate componentele au putut fi colorate&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;DA\n&amp;quot;;                   // graful e bipartit&lt;br /&gt;
    for( int i = 1; i &amp;lt;= n; i++ )     // afisam nodurile colorate cu 1 ( prima multime )&lt;br /&gt;
      if ( cul[i] == 1 )&lt;br /&gt;
        fout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
    for( int i = 1; i &amp;lt;= n; i++ )     // afisam nodurile colorate cu -1&lt;br /&gt;
      if ( cul[i] == -1 )&lt;br /&gt;
        fout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;NU&amp;quot;;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
</feed>