<?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_15</id>
	<title>Clasa a XI-a lecția 15 - 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_15"/>
	<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_15&amp;action=history"/>
	<updated>2026-04-13T19:17:34Z</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_15&amp;diff=17294&amp;oldid=prev</id>
		<title>Bella: /* Tema Optionala */</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_15&amp;diff=17294&amp;oldid=prev"/>
		<updated>2020-02-07T11:19:51Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Tema Optionala&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= BFS =&lt;br /&gt;
Se parcurge vârful de start, apoi vecinii acestuia, apoi vecinii nevizitați ai acestora, etc, până când sunt vizitate toate vârfurile accesibile. Practic, pentru a stabili ordinea de vizitare se folosește o coadă, iar pentru a stabili dacă un vârf a fost sau nu vizitat se foloseşte un vector caracteristic.&lt;br /&gt;
Algoritmul este:&lt;br /&gt;
adaugăm în coadă vârful inițial și îl vizităm&lt;br /&gt;
cât timp coada este nevidă &lt;br /&gt;
extragem un element din coadă&lt;br /&gt;
determinăm vecinii nevizitați ai vârfului extras, îi vizităm și îi adăugăm în coadă&lt;br /&gt;
eliminăm elementul din coadă&lt;br /&gt;
Observație&lt;br /&gt;
Dacă graful nu este conex, în urma parcurgerii nu se vor vizita toate vârfurile.&lt;br /&gt;
&lt;br /&gt;
[[Image:bbfs-animatie-1x.gif]]&lt;br /&gt;
&lt;br /&gt;
Vârfurile grafului au fost parcurse în ordinea: 5 2 4 7 1 3 6 8 9.\&lt;br /&gt;
În urma parcurgerii în latime, muchiile folosite pentru parcurgere formează un arbore. Acest arbore este graf parțial al grafului dat (dacă graful este conex), și se numește arbore parțial de parcurgere. Pentru graful de mai sus, arborele de parcurgere pornind din vârful 5 este:&lt;br /&gt;
&lt;br /&gt;
[[Image:bfs-arbore.png]]&lt;br /&gt;
&lt;br /&gt;
Acest arbore poate fi considerat arbore cu rădăcină, aceasta fiind chiar vârful de start, 5.&lt;br /&gt;
&lt;br /&gt;
[[Image:bfs-arbore-cu-radacina.png]]&lt;br /&gt;
&lt;br /&gt;
În acest caz, odată cu parcurgerea se poate construi și vectorul de “tați” t[] al arborelui. În acest exemplu el este:&lt;br /&gt;
&lt;br /&gt;
k     1 2 3 4 5 6 7 8 9 &lt;br /&gt;
t[k]  2 5 2 5 0 4 5 7 7 &lt;br /&gt;
&lt;br /&gt;
Din vectorul de tați al unui arbore se poate determina ușor pentru un vârf oarecare un lanț de la acel vârf la rădăcina arborelui. Arborii obținuți în urma parcurgerii în lățime au proprietatea că lanțul de la vârful de pornire la oricare vârf accesibil din graf obținut din arborele de parcurgere are lungime minimă.&lt;br /&gt;
== BFS Nerecursiv ==&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
void BFS( nod de start ){                              &lt;br /&gt;
  marcam ca vizitat nodul de start&lt;br /&gt;
  punem nodul de start in coada&lt;br /&gt;
  while( avem elem in coada ){                                &lt;br /&gt;
    parcurg toti vecinii primului nod din coada si pentru fiecare vecin nevizitat al acestuia&lt;br /&gt;
      il marchez ca vizitat&lt;br /&gt;
      il pun in coada&lt;br /&gt;
    sterg din coada nodul curent/trec la urm element din coada&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== BFS Recursiv ==&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Inainte de a apela functia, vom pune nodul de start in coada, marcandu-l ca vizitat&lt;br /&gt;
&lt;br /&gt;
void BFS( ){                              &lt;br /&gt;
  if (coada nu e vida) &lt;br /&gt;
    extrag primul nod din coada si il tiparesc                              &lt;br /&gt;
    parcurg toti vecinii acestuia si pentru fiecare vecin nevizitat &lt;br /&gt;
      il marchez ca vizitat&lt;br /&gt;
      il pun in coada&lt;br /&gt;
    scot din coada primul element&lt;br /&gt;
    reapelez functia&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BFS Nerecursiv - pe matrice de adiacenta, implementare coada pe vector ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream in(&amp;quot;BFS.in&amp;quot;);&lt;br /&gt;
ofstream out(&amp;quot;BFS.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 v[1001];         // vector de frecventa in care marchez daca am vizitat un nod&lt;br /&gt;
&lt;br /&gt;
void BFS( int start ){                             // pornim parcurgerea de la un nod dat&lt;br /&gt;
  int i = 1;&lt;br /&gt;
  int vf = 0;&lt;br /&gt;
  v[start] = 1;                                    // 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 &amp;amp;&amp;amp; v[vecin] == 0 ){   // daca vecinii nu au fost vizitati&lt;br /&gt;
        v[vecin] = 1;                              // mstchez vecinul ca vizitat&lt;br /&gt;
        c[++vf] = vecin;                           // ii pun in coada&lt;br /&gt;
      }&lt;br /&gt;
    i++;                                           // trec la urmatorul element din coada&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  in &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m &amp;gt;&amp;gt; x;&lt;br /&gt;
  for( int l = 1; l &amp;lt;= m; l++ ){&lt;br /&gt;
    in &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;
  BFS( x );&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;
=== BFS Nerecursiv - reprezentare cu matrice de adiacenta, implementare coada din queue ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;lt;queue&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream in( &amp;quot;BFS.in&amp;quot; );&lt;br /&gt;
ofstream out( &amp;quot;BFS.out&amp;quot; );&lt;br /&gt;
int mat[101][101], n;&lt;br /&gt;
bool viz[101];              // vectorul in care marcam daca un nod a fost vizitat sau nu&lt;br /&gt;
queue&amp;lt;int&amp;gt; q;               // coada in care pun nodurile in ordinea vizitarii&lt;br /&gt;
void bfs( int start ){&lt;br /&gt;
  q.push(start);                           // punem notul x in stiva lis&lt;br /&gt;
  viz[start] = 1;                          // marcam ca vizitat nodul x in strun vect de frecv&lt;br /&gt;
  out &amp;lt;&amp;lt; start;                            // facem afisarea pe masura ce parcurgem&lt;br /&gt;
  while( q.size() ) {                      // cata vreme am elem in coada&lt;br /&gt;
    for( int i = 1; i &amp;lt;= n; i++ ){         // parcurg toti vecinii si ii pun in coada pe cei nevizitati&lt;br /&gt;
      int nod = q.front();&lt;br /&gt;
      if( mat[nod][i] &amp;amp;&amp;amp; !viz[i] ){        // pe poz 0 in coada voi avea tot timpul elementul curent&lt;br /&gt;
      	q.push(i);                         // pun vecinul in coada&lt;br /&gt;
       	out &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; i;                   // afizez vecinul&lt;br /&gt;
        viz[i] = 1;                        // il marchez ca vizitat&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    q.pop();	// scot din coada modul pe care tocmai l-am afisat si caruia i-am parcurs toti vecinii&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int m, i, a, b, start;&lt;br /&gt;
  in &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m &amp;gt;&amp;gt; start;         // start = nodul de la care incepem parcurgerea bfs&lt;br /&gt;
  for( i = 0; i &amp;lt; m; i++ ) {&lt;br /&gt;
    in &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b;&lt;br /&gt;
    mat[a][b] = 1;&lt;br /&gt;
    mat[b][a] = 1;&lt;br /&gt;
  }&lt;br /&gt;
  bfs( start );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BFS Rerecursiv - reprezentare cu matrice de adiacenta ===&lt;br /&gt;
====Varianta 1 de implementare cu coada pe vector ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// BFS recursiv, matrice de adiacenta&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream in (&amp;quot;bfs.in&amp;quot;);&lt;br /&gt;
ofstream out (&amp;quot;bfs.out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
int a[102][102], n, sf, k;    // sf - sfarsitul cozii, k -nodul curent&lt;br /&gt;
bool viz[102];                // pentru fiecare nod marcam daca a fost vizitat&lt;br /&gt;
int c[102];                   // coada care retine nodurile in ordinea vizitarii&lt;br /&gt;
&lt;br /&gt;
void bfs(){&lt;br /&gt;
  if ( k &amp;lt;= sf ){                 // daca coada nu e vida&lt;br /&gt;
    int nod = c[k];               // extrag primul element si il tiparesc&lt;br /&gt;
    out &amp;lt;&amp;lt; nod &amp;lt;&amp;lt; &amp;quot; &amp;quot;;            // afisez elem&lt;br /&gt;
    for (int i = 1 ; i &amp;lt;= n; i++)    // pun in coada toti vecinii nevizitati ai lui nod&lt;br /&gt;
      if ( a[nod][i] == 1 &amp;amp;&amp;amp; viz[i] == 0 ){&lt;br /&gt;
      c[++sf]= i;&lt;br /&gt;
      viz[i] = 1;&lt;br /&gt;
    }&lt;br /&gt;
    k++;&lt;br /&gt;
    bfs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int m, start;&lt;br /&gt;
  in &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m &amp;gt;&amp;gt; start;&lt;br /&gt;
&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= m; i++ ) {&lt;br /&gt;
    int x, y;&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;
  }&lt;br /&gt;
&lt;br /&gt;
  // incep parcurgerea grafului de la nodul start&lt;br /&gt;
  c[1] = start;          // pun nodul start in coada&lt;br /&gt;
  viz[start] = 1;        // il marchez ca l-am vizitat&lt;br /&gt;
  k = sf = 1;            // k - nodul pe care ma gasesc, sf sfarsitul cozii in care pun nodurile ce urmeaza a fi vizitate&lt;br /&gt;
  bfs();&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;
==== Varianta de implementare cu coada din queue ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// folosind coada, recursiv&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;lt;queue&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream in (&amp;quot;BFS.in&amp;quot;);&lt;br /&gt;
ofstream out (&amp;quot;BFS.out&amp;quot;);&lt;br /&gt;
queue&amp;lt;int&amp;gt; q;                         // definim q o coada de int-uri&lt;br /&gt;
int a[102][102], n;&lt;br /&gt;
bool viz[102];                        // pentru fiecare nod marcam daca a fost vizitat&lt;br /&gt;
&lt;br /&gt;
void bfs(){&lt;br /&gt;
  if ( !q.empty() ){                  // daca coada nu e vida&lt;br /&gt;
    int nod = q.front();              // extrag primul element si il tiparesc&lt;br /&gt;
    out &amp;lt;&amp;lt; nod &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    for (int i = 1 ; i &amp;lt;= n; i++){    // pun in coada toti vecinii mevizitati primului element din coada&lt;br /&gt;
      if ( a[nod][i] == 1 &amp;amp;&amp;amp; viz[i] == 0 ){&lt;br /&gt;
        q.push(i);&lt;br /&gt;
        viz[i] = 1;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    q.pop();&lt;br /&gt;
    bfs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int m, start;&lt;br /&gt;
  in &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m &amp;gt;&amp;gt; start;&lt;br /&gt;
 &lt;br /&gt;
  for ( int i = 1; i &amp;lt;= m; i++ ) {&lt;br /&gt;
    int x, y;&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;
  }&lt;br /&gt;
&lt;br /&gt;
  q.push(start);         &lt;br /&gt;
  viz[start] = 1;&lt;br /&gt;
  bfs();&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;
&lt;br /&gt;
=== BFS Rerecursiv - reprezentare cu matrice de adiacenta, implementare coada din queue ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// folosind coada, recursiv&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;lt;queue&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream in (&amp;quot;BFS.in&amp;quot;);&lt;br /&gt;
ofstream out (&amp;quot;BFS.out&amp;quot;);&lt;br /&gt;
queue&amp;lt;int&amp;gt; q;                         // definim q o coada de int-uri&lt;br /&gt;
int a[102][102], n;&lt;br /&gt;
bool viz[102];                        // pentru fiecare nod marcam daca a fost vizitat&lt;br /&gt;
&lt;br /&gt;
void bfs(){&lt;br /&gt;
  if ( !q.empty() ){                  // daca coada nu e vida&lt;br /&gt;
    int nod = q.front();              // extrag primul element si il tiparesc&lt;br /&gt;
    out &amp;lt;&amp;lt; nod &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    for (int i = 1 ; i &amp;lt;= n; i++){    // pun in coada toti vecinii mevizitati primului element din coada&lt;br /&gt;
      if ( a[nod][i] == 1 &amp;amp;&amp;amp; viz[i] == 0 ){&lt;br /&gt;
        q.push(i);&lt;br /&gt;
        viz[i] = 1;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    q.pop();&lt;br /&gt;
    bfs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int m, start;&lt;br /&gt;
  in &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m &amp;gt;&amp;gt; start;&lt;br /&gt;
 &lt;br /&gt;
  for ( int i = 1; i &amp;lt;= m; i++ ) {&lt;br /&gt;
    int x, y;&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;
  }&lt;br /&gt;
&lt;br /&gt;
  q.push(start);         &lt;br /&gt;
  viz[start] = 1;&lt;br /&gt;
  bfs();&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;
= TEMA BFS = &lt;br /&gt;
== Tema Teorie + Laborator ==&lt;br /&gt;
Implementare BFS&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=19 BFS PBINFO] - TEORIE&lt;br /&gt;
* [https://www.infoarena.ro/problema/bfs BFS INFOARENA] - TEORIE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tema Optionala ==&lt;br /&gt;
recapitulare BFS pe matrice ( LEE )&lt;br /&gt;
* https://www.infoarena.ro/problema/ai&lt;br /&gt;
* https://www.infoarena.ro/problema/vila&lt;br /&gt;
usor&lt;br /&gt;
* https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=2165 graf1 OJI 2006, Clasele XI-XII &lt;br /&gt;
* https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1021 cartite OJI 2014, Clasele XI-XII &lt;br /&gt;
mediu&lt;br /&gt;
* https://www.infoarena.ro/problema/reinvent - ONI 2009, clasele 11-12&lt;br /&gt;
* https://www.infoarena.ro/problema/amici2 - ONI 2013, clasele 11-12&lt;br /&gt;
* https://www.infoarena.ro/problema/markon - Concursul National Urmasii lui Moisil 2012, clasele 11-12&lt;br /&gt;
&lt;br /&gt;
* https://www.infoarena.ro/problema/banana - ONI 2002 (??? dificultate )&lt;br /&gt;
&lt;br /&gt;
greu&lt;br /&gt;
* https://www.infoarena.ro/problema/atac2 - ONI 2008 clasele 11-12 BFS/Belman/Cuplaj de cos minim&lt;br /&gt;
* https://codeforces.com/problemset/problem/398/C constructive algorithms &lt;br /&gt;
&lt;br /&gt;
mai multe probleme [https://www.infoarena.ro/cauta-probleme?tag_id[]=47 aici]:&lt;br /&gt;
= Tema Rezolvari = &lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=484 LantMinim]====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lant minim de la p la q - afisare drum&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat și două vârfuri p q. Să se determine cel mai scurt lanț cu extremitățile p q.&lt;br /&gt;
 lantminim.in&lt;br /&gt;
 6 2 6&lt;br /&gt;
 1 2&lt;br /&gt;
 1 3&lt;br /&gt;
 1 4&lt;br /&gt;
 3 4&lt;br /&gt;
 4 5&lt;br /&gt;
 4 6&lt;br /&gt;
 5 6&lt;br /&gt;
&lt;br /&gt;
 lantminim.out&lt;br /&gt;
 4&lt;br /&gt;
 2 1 4 6 &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatie:&amp;#039;&amp;#039;&amp;#039; Lungimea lantului intre 2 1 4 6 este de fapt 3. Prin definitie, lungimea unui lant este numarul muchiilor, nu numarul de noduri componente ale lantului. Problema specifica insa ca se doreste a se afisa numarul de noduri din lantul minim, ci nu lungimea lantului.&lt;br /&gt;
&lt;br /&gt;
Rezolvare:&lt;br /&gt;
Vom parcurge in latime graful, pornind de la nodul p. Pe masura ce vom vizita nodurile:&lt;br /&gt;
* vom memora pentru fiecare nod distanta de la p la acestea, intr-un vector dist. Astfel ca la final dist[q] va retine distanta de la p la q.&lt;br /&gt;
&lt;br /&gt;
* vom memora pentru fiecare nod, nodul prin care s-a ajuns la acesta, adica predecesorul lui, sau cum l-am denumit aici tatal. Acest vector de tati ne ajuta sa reconstituim drumul din aproape in aproape pornind de la nodul q, pana la nodul de pornire, pentru care tatal e 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin(&amp;quot;lantminim.in&amp;quot;);&lt;br /&gt;
ofstream fout(&amp;quot;lantminim.out&amp;quot;);&lt;br /&gt;
/// pt p = 2 si q = 6 si muchiile : 1 2, 1 3, 1 4,3 4,4 5,4 6,5 6&lt;br /&gt;
/// nod:  1 2 3 4 5 6 7&lt;br /&gt;
/// tati: 2 0   1   4     // tatal lui 6 e 4, al lui 4 e 1, al lui 1 e 2, al lui 2 e 0 ( de la el am pornit deci ne oprim)&lt;br /&gt;
&lt;br /&gt;
int n, m, i, j, p, q;&lt;br /&gt;
int a[101][101];&lt;br /&gt;
int coada[101];          // coada in care tin nodurile in ordinea vizitarii lor&lt;br /&gt;
int dist[101];           // dinst de la nodul de start pana la nodul curent&lt;br /&gt;
int tata[101];           // vector de frecventa in care marchez daca am vizitat un nod&lt;br /&gt;
&lt;br /&gt;
void tipar( int q ){     // tipareste nodurile prin care am ajuns la q folosindu-ne de vect de tati&lt;br /&gt;
  if( q ){               // daca q e 0 ne oprim, &lt;br /&gt;
    tipar ( tata[q] );   // tiparesc intai tatal lui q si apoi q &lt;br /&gt;
    fout &amp;lt;&amp;lt; q &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
void BFS( int start ){                           // pornim parcurgerea de la un nod dat&lt;br /&gt;
  int k = 1;&lt;br /&gt;
  int vf = 0;&lt;br /&gt;
&lt;br /&gt;
  dist[start] = 1;                               // marchez ca vizitat nodul start in vectorul in care itn distantele&lt;br /&gt;
  tata[start] = 0;&lt;br /&gt;
  coada[++vf] = start;                           // punem in coada nodul de la care pornim&lt;br /&gt;
  while( k &amp;lt;= vf ){                              // cata vreme mai am elemente in coada&lt;br /&gt;
    int nod = coada[k];                          // nodul curent&lt;br /&gt;
    //fout &amp;lt;&amp;lt; nod &amp;lt;&amp;lt; &amp;quot; &amp;quot;;                        // afisez nodul curent&lt;br /&gt;
    for(int i = 1; i &amp;lt;= n; i++ )                 // parcurg toti vecinii nodului curent&lt;br /&gt;
      if( a[nod][i] == 1 &amp;amp;&amp;amp; dist[i] == 0 ){      // daca vecinii nu au fost vizitati (nu le-am marcat dist pana la p&lt;br /&gt;
        coada[++vf] = i;                         // ii pun in coada&lt;br /&gt;
        dist[i] = dist[nod] + 1;                 // dist de la start pana la el, e dist de la nod pana la start + 1&lt;br /&gt;
        tata[i] = nod;&lt;br /&gt;
      }&lt;br /&gt;
    k++;                                         // trec la urmatorul element din coada&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; p &amp;gt;&amp;gt; q;&lt;br /&gt;
  while( 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;
  BFS( p );&lt;br /&gt;
  fout &amp;lt;&amp;lt; dist[q] &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;   // tiparim dist de la p la q memorata in vect dist&lt;br /&gt;
  tipar( q );                // tiparim nodurile prin care am trecut ca sa ajung la q, folosindu-ne de vect de tati&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
</feed>