<?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_13</id>
	<title>Clasa a XI-a lecția 13 - 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_13"/>
	<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_13&amp;action=history"/>
	<updated>2026-04-13T17:53: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_13&amp;diff=17313&amp;oldid=prev</id>
		<title>Bella: /* Arbore. Pădure */</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_13&amp;diff=17313&amp;oldid=prev"/>
		<updated>2020-02-12T08:20:51Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Arbore. Pădure&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
= Grafuri neorientate =&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color:#dd0000&amp;quot;&amp;gt;Definitii &amp;lt;/span&amp;gt; ===&lt;br /&gt;
Se numește &amp;#039;&amp;#039;&amp;#039;graf neorientat&amp;#039;&amp;#039;&amp;#039; o pereche ordonată de mulțimi G=(X,U), unde:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;X&amp;#039;&amp;#039;&amp;#039; este o mulțime finită și nevidă de elemente numite &amp;#039;&amp;#039;&amp;#039;vârfuri&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;noduri&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;U&amp;#039;&amp;#039;&amp;#039; este o mulțime finită de submulțimi cu două elemente din X, numite &amp;#039;&amp;#039;&amp;#039;muchii&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
Vom nota în continuare vârfurile cu valori între 1 și n – unde n este numărul de vârfuri din graf, iar muchiile cu (x,y) sau [x,y], unde x și y sunt vârfuri și se numesc &amp;#039;&amp;#039;&amp;#039;extremitățile muchiei&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Vecin al unui vârf x&amp;#039;&amp;#039;&amp;#039; este orice vârf y cu proprietatea că există muchia (x,y).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Varfuri adiacente&amp;#039;&amp;#039;&amp;#039; sunt două vârfuri între care există muchie.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Muchi incidente&amp;#039;&amp;#039;&amp;#039; sunt două muchii care au o o extremitate comună. Un vârf este incident cu o muchie dacă vârful este extremitate a acelei muchii.&lt;br /&gt;
&lt;br /&gt;
Mulțimea muchiilor are proprietatea de simetrie: dacă (x,y) este muchie, atunci și (y,x) este muchie.&lt;br /&gt;
&lt;br /&gt;
Conform definiției:&lt;br /&gt;
&lt;br /&gt;
* într-un graf neorientat nu există muchie de la un vârf la el însuși;&lt;br /&gt;
* intre două vârfuri distincte există cel mult o muchie.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Fie G = (X,U), unde:&lt;br /&gt;
&lt;br /&gt;
[[Image:graf-neorientat.png]] &lt;br /&gt;
&lt;br /&gt;
 X={1,2,3,4,5,6,7,8,9,10,11}&lt;br /&gt;
 U={(1,4),(1,5),(2,3),(2,8),(3,11),(4,5),(4,9),(7,10),(8,11)}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color:#dd0000&amp;quot;&amp;gt;Gradul unui varf &amp;lt;/span&amp;gt; ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Grad al unui vârf&amp;#039;&amp;#039;&amp;#039; = numărul de vârfuri adiacente cu acesta (sau numărul de muchii incidente cu acesta). Gradul unui vărf x se notează &amp;#039;&amp;#039;&amp;#039;d(x)&amp;#039;&amp;#039;&amp;#039; .&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* un vârf cu gradul 0 se numește izolat. În graful de mai sus, vârful 6 este izolat.&lt;br /&gt;
* un vârf cu gradul 1 se numește terminal. În graful de mai sus, vârful 9 este vârf terminal.&lt;br /&gt;
* gradul maxim al unui vârf într-un graf cu n vârfuri este n-1.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Teoremă&amp;#039;&amp;#039;&amp;#039;: Într-un graf neorientat, &amp;#039;&amp;#039;&amp;#039;suma gradelor tuturor vârfurilor este dublul numărului de muchii.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Consecințe:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Suma gradelor tuturor vârfurilor este număr par.&lt;br /&gt;
* Într-un graf neorientat, numărul de vârfuri de grad impar este întotdeauna par.&lt;br /&gt;
* Întrebare: Este posibil ca într-un grup de 5 persoane, fiecare persoană să aibă exact 3 prieteni?&lt;br /&gt;
&lt;br /&gt;
==  Reprezentarea grafurilor neorientate  ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color:#dd0000&amp;quot;&amp;gt;Matricea de adiacență &amp;lt;/span&amp;gt;===&lt;br /&gt;
Pentru un graf neorientat &amp;#039;&amp;#039;&amp;#039;G = (X,U)&amp;#039;&amp;#039;&amp;#039; cu &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; vârfuri, matricea de adiacență este o matrice cu n linii și n coloane ce contine elemente din multimee {0,1} astfel: &lt;br /&gt;
 Ai,j =  1 dacă (i,j) ∈ U  - adica exista muchie de la nodul i la nodul j&lt;br /&gt;
         0 dacă (i,j) ∉ U&lt;br /&gt;
Exemplu: Pentru graful neorientat de mai jos avem următoarea matrice de adiacență:&lt;br /&gt;
&lt;br /&gt;
[[Image:graf-neorientat-1.png]]&lt;br /&gt;
&lt;br /&gt;
 0 1 0 0 1&lt;br /&gt;
 1 0 0 0 1&lt;br /&gt;
 0 0 0 0 0&lt;br /&gt;
 0 0 0 0 1&lt;br /&gt;
 1 1 0 1 0&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* matricea de adiacență este &amp;#039;&amp;#039;&amp;#039;simetrică&amp;#039;&amp;#039;&amp;#039; față de diagonala principală;&lt;br /&gt;
* elementele de &amp;#039;&amp;#039;&amp;#039;pe diagonala principală sunt 0&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* gradul unui vârf &amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039; este egal cu numărul de elemente 1 de pe linia (sau coloana) x;&lt;br /&gt;
* suma tuturor elementelor din matricea de adiacență a unui graf neorientat este egală cu dublul numărului de muchii din graf.&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=412 Adiacenta] ====&lt;br /&gt;
Se dă numarul de noduri &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039;, numarul de muchii &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; si lista muchiilor unui graf neorientat. Să se afișeze matricea de adiacență a grafului.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;adiacenta.in&amp;#039;&amp;#039;&amp;#039;&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;
&amp;#039;&amp;#039;&amp;#039;adiacenta.out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 0 1 1 1 0 &lt;br /&gt;
 1 0 0 1 0 &lt;br /&gt;
 1 0 0 1 1 &lt;br /&gt;
 1 1 1 0 1 &lt;br /&gt;
 0 0 1 1 0 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream fin( &amp;quot;adiacenta.in&amp;quot; );&lt;br /&gt;
ofstream fout( &amp;quot;adiacenta.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int n, m, x, y;&lt;br /&gt;
int a[101][101];&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 = 1; i &amp;lt;= m; i++ ){&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;
&lt;br /&gt;
  for( int j = 1; j &amp;lt;= n; j++ ){&lt;br /&gt;
    for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
      fout &amp;lt;&amp;lt; a[i][j]&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;#039;\n&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=413 Adiacenta1] ====&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat. Să se afișeze matricea de adiacență a grafului.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;adiacenta.in&amp;#039;&amp;#039;&amp;#039;&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;
&amp;#039;&amp;#039;&amp;#039;adiacenta.out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 0 1 1 1 0 &lt;br /&gt;
 1 0 0 1 0 &lt;br /&gt;
 1 0 0 1 1 &lt;br /&gt;
 1 1 1 0 1 &lt;br /&gt;
 0 0 1 1 0 &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream in(&amp;quot;adiacenta1.in&amp;quot;);&lt;br /&gt;
ofstream out(&amp;quot;adiacenta1.out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
int n, m, x, y, maxim;&lt;br /&gt;
int a[101][101];&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  while( !in.eof() ){&lt;br /&gt;
    in &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y;&lt;br /&gt;
    a[x][y] = a[y][x] = 1;&lt;br /&gt;
    if( x &amp;gt; maxim )&lt;br /&gt;
      maxim = x;&lt;br /&gt;
    if(y &amp;gt; maxim)&lt;br /&gt;
      maxim = y;&lt;br /&gt;
  }&lt;br /&gt;
  for( int j = 1; j &amp;lt;= maxim; j++ ){&lt;br /&gt;
    for( int i = 1; i &amp;lt;= maxim; i++ )&lt;br /&gt;
      out &amp;lt;&amp;lt; a[i][j] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    out &amp;lt;&amp;lt; endl;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color:#dd0000&amp;quot;&amp;gt; Lista de muchii &amp;lt;/span&amp;gt; ===&lt;br /&gt;
Lista de muchii a unui graf neorientat reprezintă o mulțime ce conține toate muchiile din graf.&lt;br /&gt;
&lt;br /&gt;
[[Image:graf-neorientat-1.png]]&lt;br /&gt;
&lt;br /&gt;
Pentru graful de mai sus, lista de muchii este:&lt;br /&gt;
&lt;br /&gt;
U={[1,2],[1,5],[2,5],[4,5]}&lt;br /&gt;
&lt;br /&gt;
Pentru reprezentarea în memorie putem folosi:&lt;br /&gt;
&lt;br /&gt;
* un tablou unidimensional cu elemente de tip struct {int I,J;}&lt;br /&gt;
* două tablouri unidimensionale cu elemente de tip int&lt;br /&gt;
* o listă alocată dinamic&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color:#dd0000&amp;quot;&amp;gt; Lista de adiacențe (de vecini) &amp;lt;/span&amp;gt;===&lt;br /&gt;
Pentru un graf neorientat cu &amp;#039;&amp;#039;&amp;#039;G=(X,U)&amp;#039;&amp;#039;&amp;#039; se va memora numărul de vârfuri &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; și apoi, pentru fiecare vârf &amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;, lista vârfurilor adiacente cu &amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;, adică a vârfurilor &amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039; cu proprietatea că există muchia &amp;#039;&amp;#039;&amp;#039;(x,y)&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Pentru graful alăturat, &lt;br /&gt;
[[Image:graf-neorientat-1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
listele de adiacență sunt:&lt;br /&gt;
 1: 2 5&lt;br /&gt;
 2: 1 5&lt;br /&gt;
 3: vidă&lt;br /&gt;
 4: 5&lt;br /&gt;
 5: 1 2 4&lt;br /&gt;
Ordinea in care nodurile sunt memorate in lista depinde de ordinea in care au fost introduse muchiile. de exemplu, daca prima muchie va fi (4,5) in lista lui 4 primul nod va fi 5 si in lista lui 5 primul nod va fi 4 (daca adaugarea se face la sfarsitul listei, adica fiecare lista este o coada ). &lt;br /&gt;
&lt;br /&gt;
La reprezentarea în memorie trebui avut în vedere că dimensiunile listelor de vecini sunt variabile. De aceea, este neeficientă utilizarea unor tablouri alocate static. Astfel, putem folosi:&lt;br /&gt;
&lt;br /&gt;
* un șir de n liste simplu (dublu) înlănțuite alocate dinamic.&lt;br /&gt;
* un șir de n vectori din STL;&lt;br /&gt;
&lt;br /&gt;
==== Implementare cu liste alocate dinamic ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin( &amp;quot;listavecini.in&amp;quot; );&lt;br /&gt;
ofstream fout( &amp;quot;listavecini.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
struct nod {&lt;br /&gt;
  int info;&lt;br /&gt;
  nod *adr;&lt;br /&gt;
}* L[100];&lt;br /&gt;
&lt;br /&gt;
void adauga ( nod *p, int val ){&lt;br /&gt;
  nod *c = p;&lt;br /&gt;
  nod *d = new nod;&lt;br /&gt;
  d -&amp;gt; info = val;&lt;br /&gt;
  d-&amp;gt;adr = c-&amp;gt;adr;&lt;br /&gt;
  c-&amp;gt;adr = d;&lt;br /&gt;
  p-&amp;gt;info ++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tipar( nod *p ){                     // tiparesc lista&lt;br /&gt;
  while( p ){&lt;br /&gt;
    fout &amp;lt;&amp;lt; p-&amp;gt;info &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    p = p-&amp;gt;adr;&lt;br /&gt;
  }&lt;br /&gt;
  fout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, i, j, x, y;&lt;br /&gt;
&lt;br /&gt;
  fin &amp;gt;&amp;gt; n;&lt;br /&gt;
  // pe prima poz a fiecarei liste vom pune numarul de elemente, initial 0&lt;br /&gt;
  for( i = 1; i &amp;lt;= n; i++ ){&lt;br /&gt;
    L[i] = new nod;&lt;br /&gt;
    L[i]-&amp;gt;info = 0;&lt;br /&gt;
    L[i]-&amp;gt;adr = 0;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  while ( fin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y  ) {&lt;br /&gt;
    adauga ( L[x], y );  // in lista lui x adaugam nodul y&lt;br /&gt;
    adauga ( L[y], x );  // in lista lui y adaugam nodul x&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for ( i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
    tipar(L[i]);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Implementare cu vectori STL ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
vector&amp;lt; int &amp;gt; g[100];&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  FILE *fin, *fout;&lt;br /&gt;
  int n, i, j, x, y, m;&lt;br /&gt;
  ifstream fin( &amp;quot;listeadiacenta.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
  ofstream fout( &amp;quot;listeadiacenta.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
  fscanf( fin, &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
&lt;br /&gt;
  // presupunand ca muchiile nu se repeta&lt;br /&gt;
  while ( fscanf( fin, &amp;quot;%d%d&amp;quot;, &amp;amp;x, &amp;amp;y ) == 2 ) {&lt;br /&gt;
    g[x].push_back( y );  // in lista lui x adaugam nodul y&lt;br /&gt;
    g[y].push_back( x );  // in lista lui y adaugam nodul x&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  for ( i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
    fout &amp;lt;&amp;lt; g[i].size() &amp;lt;&amp;lt; &amp;quot; &amp;quot;;           // afisam nr de vecini ai nodului i&lt;br /&gt;
    for ( j = 0; j &amp;lt; g[i].size(); j++ )   // afisam vecinii nodului i; acestia nu vor fi afisati in ord crescatoare&lt;br /&gt;
        fout &amp;lt;&amp;lt; g[i][j] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;;&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot; ;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aplicatie: [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=414 Listavecini]===&lt;br /&gt;
===== Liste alocate dinamic =====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin( &amp;quot;listavecini.in&amp;quot; );&lt;br /&gt;
ofstream fout( &amp;quot;listavecini.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
struct nod {&lt;br /&gt;
  int info;&lt;br /&gt;
  nod *adr;&lt;br /&gt;
}* L[100];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void adauga ( nod *p, int val ){&lt;br /&gt;
  nod *c = p;&lt;br /&gt;
  nod *d = new nod;&lt;br /&gt;
  d-&amp;gt;info = val;&lt;br /&gt;
  while( c-&amp;gt;adr &amp;amp;&amp;amp; c-&amp;gt;adr-&amp;gt;info &amp;lt;= val )  // parcurg lista pana dau de un element mai mic sau egal cu val&lt;br /&gt;
    c = c -&amp;gt; adr;&lt;br /&gt;
  // inserez intre c si c-&amp;gt;adr doar daca val e diferita de cea din c&lt;br /&gt;
  if( c == p || ( c != p &amp;amp;&amp;amp; c-&amp;gt;info != val ) ){                   // daca val nu e in list&lt;br /&gt;
    d-&amp;gt;adr = c-&amp;gt;adr;                      // adaug val intre nodurile c si c-&amp;gt;adr&lt;br /&gt;
    c-&amp;gt;adr = d;&lt;br /&gt;
    p-&amp;gt;info ++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
void tipar( nod *p ){                     // tiparesc lista&lt;br /&gt;
  while( p ){&lt;br /&gt;
    fout &amp;lt;&amp;lt; p-&amp;gt;info &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    p = p-&amp;gt;adr;&lt;br /&gt;
  }&lt;br /&gt;
  fout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, i, j, x, y;&lt;br /&gt;
&lt;br /&gt;
  fin &amp;gt;&amp;gt; n;&lt;br /&gt;
  // pe prima poz a fiecarei liste vom pune numarul de elemente, initial 0&lt;br /&gt;
  for( i = 1; i &amp;lt;= n; i++ ){&lt;br /&gt;
    L[i] = new nod;&lt;br /&gt;
    L[i]-&amp;gt;info = 0;&lt;br /&gt;
    L[i]-&amp;gt;adr = 0;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  while ( fin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y  ) {&lt;br /&gt;
    adauga ( L[x], y );  // in lista lui x adaugam nodul y&lt;br /&gt;
    adauga ( L[y], x );  // in lista lui y adaugam nodul x&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for ( i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
    tipar(L[i]);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Liste implementate cu vectori STL =====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
vector&amp;lt; int &amp;gt; g[100];&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, i, j, x, y, m;&lt;br /&gt;
  ifstream fin( &amp;quot;listavecini.in&amp;quot; );&lt;br /&gt;
  ofstream fout( &amp;quot;listavecini.out&amp;quot; );&lt;br /&gt;
  fin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
  while ( fin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y  ) {&lt;br /&gt;
    g[x].push_back( y );  // in lista lui x adaugam nodul y&lt;br /&gt;
    g[y].push_back( x );  // in lista lui y adaugam nodul x&lt;br /&gt;
  }&lt;br /&gt;
  /***********************************************************************/&lt;br /&gt;
  // numai pentru ca muchiile se pot repeta trebuie sa eliminam dublurile&lt;br /&gt;
  // si pentru ca ni se cere afisarea in ordine a nodurilor, sortam listele de adiacenta&lt;br /&gt;
  for ( i = 1; i &amp;lt;= n; i++ ){             // daca trebuie sa parcurg vecinii in ordine&lt;br /&gt;
    sort( g[i].begin(), g[i].end() );     // sortam lista de vecini a nodului i&lt;br /&gt;
    j = 0;&lt;br /&gt;
    while (j &amp;lt; g[i].size() - 1 )          // verific lista i sa nu contina dubluri&lt;br /&gt;
      if( g[i][j] == g[i][j+1] )          // daca am o dublura, pe poz j am acelasi elem ca pe poz j+1&lt;br /&gt;
        g[i].erase(g[i].begin() + j );    // sterg din lista i elementul de pe poz j&lt;br /&gt;
      else&lt;br /&gt;
        j++;&lt;br /&gt;
  }&lt;br /&gt;
 /************************************************************************/&lt;br /&gt;
 for ( i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
    fout &amp;lt;&amp;lt; g[i].size() &amp;lt;&amp;lt; &amp;quot; &amp;quot;;           // afisam nr de vecini ai nodului i&lt;br /&gt;
    for ( j = 0; j &amp;lt; g[i].size(); j++ )   // afisam vecinii nodului i&lt;br /&gt;
        fout &amp;lt;&amp;lt; g[i][j] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;;&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot; ;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/* varianta cu insert sort: listele de adiacenta le vom construi direct sortate;&lt;br /&gt;
daca un element mai exista in lista, nu se mai adauga.&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
vector&amp;lt; int &amp;gt; g[100];&lt;br /&gt;
void adauga ( vector &amp;lt;int&amp;gt; &amp;amp;v, int val ){&lt;br /&gt;
  int p = v.size() - 1;                  // pornim de la ultimul element al listei&lt;br /&gt;
  while( p &amp;gt;= 0 &amp;amp;&amp;amp; v[p] &amp;gt; val )          // parcurg lista pana dau de un element mai mic sau egal cu val&lt;br /&gt;
    p --;&lt;br /&gt;
&lt;br /&gt;
  if( p == -1 || v[p] != val )           // daca val pe care m-am oprit nu e egala cu cea pe care vreau sa o inserez&lt;br /&gt;
    v.insert( v.begin()+ p + 1, val );   // adaug val in lista pe pozitia p+1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, i, j, x, y;&lt;br /&gt;
  ifstream fin( &amp;quot;listavecini.in&amp;quot; );&lt;br /&gt;
  ofstream fout( &amp;quot;listavecini.out&amp;quot; );&lt;br /&gt;
  fin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
  while ( fin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y  ) {&lt;br /&gt;
    adauga ( g[x], y );  // in lista lui x adaugam nodul y&lt;br /&gt;
    adauga ( g[y], x );  // in lista lui y adaugam nodul x&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for ( i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
    fout &amp;lt;&amp;lt; g[i].size() &amp;lt;&amp;lt; &amp;quot; &amp;quot;;           // afisam nr de vecini ai nodului i&lt;br /&gt;
    for ( j = 0; j &amp;lt; g[i].size(); j++ )   // afisam vecinii nodului i&lt;br /&gt;
      fout &amp;lt;&amp;lt; g[i][j] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;;&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot; ;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Graf parțial. Subgraf. Graf complementar ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Definiție&amp;#039;&amp;#039;&amp;#039;. Fie G=(X, U) un graf neorientat. Se numeşte &amp;#039;&amp;#039;&amp;#039;graf parțial&amp;#039;&amp;#039;&amp;#039; al grafului G, graful neorientat G1=(X, U1), unde U1 ⊆ U.&lt;br /&gt;
&lt;br /&gt;
Din definiție rezultă:&lt;br /&gt;
&lt;br /&gt;
Un graf parțial al unui graf neorientat G=(V,U), are aceeaşi mulțime de vârfuri ca şi G, iar mulțimea muchiilor este o submulțime a lui U sau chiar U.&lt;br /&gt;
Fie G=(X, U) un graf neorientat. Un graf parțial al grafului G se obține păstrând vârfurile şi&lt;br /&gt;
eliminând eventual nişte muchii (se pot elimina şi toate muchiile sau chiar nici una).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Definiție.&amp;#039;&amp;#039;&amp;#039; Fie G=(X, U) un graf neorientat. Se numeşte &amp;#039;&amp;#039;&amp;#039;subgraf&amp;#039;&amp;#039;&amp;#039; al grafului G graful neorientat G1=(X1,U1) unde X1 ⊆ X iar U1 conține toate muchiile din U care au extremitățile în X1.&lt;br /&gt;
&lt;br /&gt;
Din definiție rezultă:&lt;br /&gt;
&lt;br /&gt;
Fie G=(X,U) unraf neorientat. &amp;#039;&amp;#039;&amp;#039;Un subgraf&amp;#039;&amp;#039;&amp;#039; al grafului G, se obține ştergând eventual anumite&lt;br /&gt;
vârfuri şi odată cu acestea şi muchiile care le admit ca extremitate (nu se pot şterge toate vârfurile deoarece s-ar obține un graf cu mulțimea vârfurilor vidă).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Definiție.&amp;#039;&amp;#039;&amp;#039; Fie G=(X, U) un graf neorientat. Se numeşte &amp;#039;&amp;#039;&amp;#039;graf complementar&amp;#039;&amp;#039;&amp;#039; al grafului G, graful neorientat G1=(X, U1), cu proprietatea că două vârfuri x și y sunt adiacente în G1 dacă și numai dacă nu sunt adiacente în G.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Graf initial&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
[[Image:graf-neorientat-2.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Graf partial,                      subgraf,                              graf complementar:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:graf-neorientat-2-graf-partial.png]]&lt;br /&gt;
[[Image:graf-neorientat-2-subgraf.png]][[Image:graf-neorientat-2-complementar.png]]&lt;br /&gt;
&lt;br /&gt;
Observații. Un graf neorientat oarecare poate avea mai multe grafuri parțiale și subgrafuri, dar un unic graf complementar. Mai precis:&lt;br /&gt;
&lt;br /&gt;
Teoremă: Fie G un graf neorientat cu n vârfuri și m muchii. Atunci:&lt;br /&gt;
&lt;br /&gt;
* graful G admite &amp;#039;&amp;#039;&amp;#039;2&amp;lt;sup&amp;gt;m&amp;lt;/sup&amp;gt; grafuri parțiale&amp;#039;&amp;#039;&amp;#039;; ( cate submultimi ale multimii muchiilor )&lt;br /&gt;
* graful G admite &amp;#039;&amp;#039;&amp;#039;2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;–1 subgrafuri&amp;#039;&amp;#039;&amp;#039;; ( cate submultimi ale multimii nodurilor, mai putin submultimea vida )&lt;br /&gt;
* graful G admite un unic graf complementar.&lt;br /&gt;
Justificare:&lt;br /&gt;
&lt;br /&gt;
Să ne amintim că o mulțime cu a elemente are 2&amp;lt;sup&amp;gt;a&amp;lt;/sup&amp;gt; submulțimi, inclusiv mulțimea vidă și mulțimea inițială. Atunci:&lt;br /&gt;
&lt;br /&gt;
*orice submulțime a mulțimii muchiilor induce un graf parțial. Sunt m muchii, deci 2&amp;lt;sup&amp;gt;m&amp;lt;/sup&amp;gt; submulțimi, deci tot atatea grafuri parțiale.&lt;br /&gt;
*orice submulțime a mulțimii vârfuri induce un subgraf, mai puțin mulțimea vidă – un graf nu poate avea 0 vârfuri. Similar ca mai sus, sunt 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;–1 subgrafuri.&lt;br /&gt;
*graful complementar este unic determinat, deoarece complementara unei submulțimi față de o mulțime dată este unic determinată.&lt;br /&gt;
&lt;br /&gt;
== Graf nul. Graf complet. Graf regulat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Definiție:&amp;#039;&amp;#039;&amp;#039; Un graf neorientat se numește &amp;#039;&amp;#039;&amp;#039;graf nul&amp;#039;&amp;#039;&amp;#039; dacă mulțimea muchiilor este vidă.&lt;br /&gt;
&lt;br /&gt;
Într-un graf nul toate vârfurile sunt izolate.&lt;br /&gt;
&lt;br /&gt;
Definiție. Fie G=(X, U) un graf neorientat. Graful G se numește &amp;#039;&amp;#039;&amp;#039;graf complet&amp;#039;&amp;#039;&amp;#039; dacă oricare două vârfuri&lt;br /&gt;
distincte ale sale sunt adiacente. Un graf complet cu n vârfuri se notează K&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Graful următor este graful &amp;#039;&amp;#039;&amp;#039;K&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:graf-neorientat-complet.png]] &lt;br /&gt;
&lt;br /&gt;
Într-un graf complet cu n vârfuri sunt C&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt; = n∗(n−1)/2 muchii și fiecare vârf are gradul n-1.&lt;br /&gt;
&lt;br /&gt;
Propoziție: Sunt 2&amp;lt;sup&amp;gt;n∗(n−1)/2&amp;lt;/sup&amp;gt; grafuri neorientate distincte cu n vârfuri.&lt;br /&gt;
&lt;br /&gt;
Definiție: Un graf în care toate nodurile au acelaşi grad se numește graf regulat.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Graful de mai jos este regulat.&lt;br /&gt;
&lt;br /&gt;
== Arbore. Pădure ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Definiție:&amp;#039;&amp;#039;&amp;#039; Se numește arbore un &amp;#039;&amp;#039;&amp;#039;graf conex și aciclic&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;: Graful următor este arbore:&lt;br /&gt;
&lt;br /&gt;
[[Image:graf-arbore.png]] &lt;br /&gt;
&lt;br /&gt;
Observații:&lt;br /&gt;
&lt;br /&gt;
Un arbore cu &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; vârfuri are &amp;#039;&amp;#039;&amp;#039;n-1&amp;#039;&amp;#039;&amp;#039; muchii.&lt;br /&gt;
Un arbore este un graf conex și minimal cu această proprietate; dacă s-ar mai elimina o muchie, graful nu ar mai fi conex.&lt;br /&gt;
Un arbore este un graf aciclic și maximal cu această proprietate; dacă s-ar mai adăuga o muchie, s-ar obține un ciclu.&lt;br /&gt;
Un graf parțial care este arbore se numește arbore parțial.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Definiție:&amp;#039;&amp;#039;&amp;#039;Un graf care nu conține cicluri se mai numește &amp;#039;&amp;#039;&amp;#039;pădure&amp;#039;&amp;#039;&amp;#039;. Într-o pădure fiecare componentă conexă este arbore.&lt;br /&gt;
&lt;br /&gt;
== Laborator ==&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/2707/matad matad]&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/416/grade grade]&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/430/izolate izolate]&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/417/gradmax gradmax]&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/418/subgraf subgraf]&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/419/subgraf1 subgraf1]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
</feed>