<?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=Proiect_Cella_Florescu</id>
	<title>Proiect Cella Florescu - 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=Proiect_Cella_Florescu"/>
	<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Proiect_Cella_Florescu&amp;action=history"/>
	<updated>2026-04-13T12:24:47Z</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=Proiect_Cella_Florescu&amp;diff=16311&amp;oldid=prev</id>
		<title>Bella at 07:53, 4 June 2019</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Proiect_Cella_Florescu&amp;diff=16311&amp;oldid=prev"/>
		<updated>2019-06-04T07:53:09Z</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;Proiect Cella Florescu, Andrei Diaconu, Alexandra Timofte&lt;br /&gt;
= Algoritmul lui Kruskal =&lt;br /&gt;
&lt;br /&gt;
Algoritmul lui Kruskal gaseste arborele partial de cost minim al unui graf bidirectional cu muchii  cu costuri. Ideea de baza este una de tip greedy care sorteaza muchiile in ordine crescatoare dupa cost si dupa verifica daca fiecare muchie uneste doua componente conexe diferite cu ajutorul algoritmului union-find.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Istoric ==&lt;br /&gt;
&lt;br /&gt;
Algoritmul a fost publicat prima data in Proceedings of the American Mathematical Society, anul 1956 si a fost scris de Joseph Kruskal, un matematician si informatician american, absolvent al Universitatii din Chicago.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Studiu de caz ==&lt;br /&gt;
&lt;br /&gt;
In general, in viata reala algoritmul se foloseste in mod concret pentru a gasi modul optim de a crea o retea care sa conecteze toate calculatoarele cu un cost cat mai mic. Poate de exemplu sa minimizeze lungimea cablurilor necesare, daca sunt calculatoarele fixe, sau sa creeze un plan in care se conecteaza calculatoarele intr-un mod cat mai eficient din punct de vedere financiar (daca stim pentru fiecare conexiune cat ar costa pentru a fi folosita).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Pasii algoritmului =&lt;br /&gt;
&lt;br /&gt;
# Creaza padurea de multimi disjuncte F in care initial fiecare nod este o multime separata.&lt;br /&gt;
# Citeste setul S de muchii si il sorteaza in ordine crescatoare dupa cost.&lt;br /&gt;
# Pentru fiecare muchie din S, in ordine: daca muchia uneste 2 arbori diferiti (2 multimi disjuncte), atunci uneste cei 2 arbori (cele 2 multimi) si marcheaza muchia ca utilizata.&lt;br /&gt;
&lt;br /&gt;
La finalul algoritmului, daca graful este conex (F contine doar o multime disjuncta), atunci a fost gasit un arbore partial de cost minim, muchiile acestuia fiind cele marcate drept utilizate.&lt;br /&gt;
&lt;br /&gt;
[[Image:kruskal.png|frame]]&lt;br /&gt;
[[File:UnionFindKruskalDemo.gif|400px|none]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Complexitate ==&lt;br /&gt;
&lt;br /&gt;
Pentru un graf cu N noduri si M muchii, algoritmul lui Kruskal are o complexitate medie de &amp;#039;&amp;#039;O(M log M)&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;O(M log N)&amp;#039;&amp;#039;, cele 2 complexitati fiind de fapt echivalente pentru ca &amp;#039;&amp;#039;M &amp;lt; N&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;#039;&amp;#039;, deci &amp;#039;&amp;#039;log M &amp;lt; 2 * log N&amp;#039;&amp;#039;, constanta 2 nefiind luata in calculul complexitatii.&lt;br /&gt;
Aceasta complexitate este in primul rand obtinuta prin sortarea celor M muchii dupa cost. Utilizand un algoritm de sortare precum quick-sort, complexitatea sortarii va fi de &amp;#039;&amp;#039;O(M log M)&amp;#039;&amp;#039;. De asemenea, pentru verificarea componentelor conexe, este folosita o padure de multimi disjuncte care poate cu usurinta sa faca operatiile in timp de &amp;#039;&amp;#039;O(M log M)&amp;#039;&amp;#039;. Adunand cele doua complexitati obtinem complexitatea finala asimptotica de &amp;#039;&amp;#039;O(M log M)&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Algoritmul poate fi imbunatatit daca padurile de multimi disjuncte sunt implementate sa compreseze caile si sa aiba grija sa ataseze multimea mai mica multimii mai mari. Complexitatea pasului 3 poate astfel fi redusa la &amp;#039;&amp;#039;O(M * a(N))&amp;#039;&amp;#039;, unde a este inversa functiei foarte incet crescatoare a lui Ackermann, o buna aproximare a acestei complexitati fiind chiar &amp;#039;&amp;#039;O(M log* N)&amp;#039;&amp;#039;. In cazul in care muchiile sunt deja date in ordine crescatoare dupa cost, complexitatea intregului algoritm poate fi redusa la &amp;#039;&amp;#039;O(M log* N)&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Din punctul de vedere al memoriei, algoritmul foloseste &amp;#039;&amp;#039;O(N)&amp;#039;&amp;#039; memorie suplimentara pentru structura union-find, pe langa memoria de ordin &amp;#039;&amp;#039;O(M)&amp;#039;&amp;#039; necesara pentru a memora lista de muchii.&lt;br /&gt;
&lt;br /&gt;
== Demonstratie ==&lt;br /&gt;
&lt;br /&gt;
In primul rand, daca graful initial G este conex, cum fiecare muchie care uneste 2 componente conexe diferita este adaugata, atunci in graful rezultat nu vor exista ciclii si va fi conex. Asfel, algoritmul va construi un arbore partial al grafului initial.&lt;br /&gt;
In al doilea rand, minimalitatea poate fi demonstrata prin inductie. Fie P(X): pentru setul de muchii selectate pana la un anumit pas X, exista un arbore partial de cost minim al lui G care sa contina muchiile din X.&lt;br /&gt;
Initial, P clar este adevarata deoarece orice graf conex are cel putin un arbore partial de cost minim si acest arbore include multimea vida (arborele partial inaintea primului pas).&lt;br /&gt;
La un pas al programului sa presupunem ca muchiile din setul X au fost pana acum selectate si ca T este un arbore partial de cost minim al lui G care contine muchiile din X.&lt;br /&gt;
* Daca urmatoarea muchie care este selectata este e si aceasta apartine deja lui T, atunci P este adevarata si pentru X + e.&lt;br /&gt;
* Daca e nu apartine lui T, atunci graful T + e ar avea un ciclu, fie acesta C. Fie f o muchie din ciclul C care nu apartine lui X (exista o astfel de muchie intrucat e formeaza un ciclu in T, dar nu si in X). Datorita proprietatii P(X), f nu a fost pana acum considerata de algoritm, deci are costul mai mare sau egal cu al lui e. Prin urmare, T - f + e este tot un arbore si are un cost mai mic decat T. Rezulta ca T - f + e este un arbore de cost minim care contine muchiile din setul X + e. Astfel, P(X + e) este in continuare adevarata.&lt;br /&gt;
Din principiul inductiei matematice, P este adevarata la fiecare pas al algoritmului. Astfel, arborele partial gasit de acest algoritm este de fapt un arbore partial de cost minim.&lt;br /&gt;
&lt;br /&gt;
= Implementare =&lt;br /&gt;
&lt;br /&gt;
=== Varianta neoptimizata (muchii date sub forma unei matrice de adiacenta) ===&lt;br /&gt;
Complexitate: &amp;#039;&amp;#039;O(M log M + M * N)&amp;#039;&amp;#039; (worst case - sortarea aduce termenul de M log M, in timp ce structura de union-find aduce pe cel de M * N, deoarece fara compresia cailor in cel mai rau caz se executa O(N) operatii pentru a cauta reprezentantul grupei)&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int MAXN = 1e5; /// numarul maxim de noduri&lt;br /&gt;
const int MAXM = 1e6; /// numarul maxim de muchii&lt;br /&gt;
&lt;br /&gt;
struct Edge { /// structura de muchii, x si y sunt cele doua noduri din capetele muchiei, c este costul&lt;br /&gt;
  int x, y, c;&lt;br /&gt;
  bool operator &amp;lt; (const Edge&amp;amp; other) const { /// comparatorul care sorteaza muchiile crescator dupa cost&lt;br /&gt;
     return c &amp;lt; other.c;&lt;br /&gt;
  }&lt;br /&gt;
} edg[MAXM], apm[MAXN];&lt;br /&gt;
&lt;br /&gt;
int group[MAXN + 1]; /// vectorul de tati in structura union-find&lt;br /&gt;
&lt;br /&gt;
int find_group(int node) { /// functia de gasire a grupei din structura union-find, fara compresia caii&lt;br /&gt;
  if (node != group[node]) /// cat timp nu am gasit reprezentantul grupei&lt;br /&gt;
   return find_group(group[node]); /// mergem recursiv din tata in tata pana il gasim&lt;br /&gt;
  return group[node];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n, m;&lt;br /&gt;
    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;&lt;br /&gt;
    int n, m = 0;&lt;br /&gt;
    cin &amp;gt;&amp;gt; n; /// citim numarul de noduri&lt;br /&gt;
    for (int i = 1; i &amp;lt;= n; ++i) /// si matricea de adiacenta&lt;br /&gt;
      for (int j = 1; j &amp;lt;= n; ++j) {&lt;br /&gt;
        cin &amp;gt;&amp;gt; edg[m].c; /// citim costul fiecarei muchii&lt;br /&gt;
        edg[m].x = i; /// si o adaugam in lista noastra de muchii&lt;br /&gt;
        edg[m++].y = j;&lt;br /&gt;
      }&lt;br /&gt;
    sort(edg, edg + m); /// sortarea muchiilor crescator dupa cost&lt;br /&gt;
    for (int i = 1; i &amp;lt;= n; ++i) /// initial toate nodurile formeaza grupe singulare&lt;br /&gt;
      group[i] = i;&lt;br /&gt;
    int edg_apm = 0; /// initial nu avem nicio muchie in arborele partial de cost minim&lt;br /&gt;
    for (int i = 0; i &amp;lt; m; ++i) { /// luam pe rand toate muchiile dupa ce le-am sortat&lt;br /&gt;
      int x = find_group(edg[i].x), y = find_group(edg[i].y); /// cautam reprezentatii nodurilor din capetele muchiei&lt;br /&gt;
      if (x != y) { /// daca sunt diferiti atunci inseamna ca muchia noastra trebuie adaugata la arborele partial de cost minim pe care il construim&lt;br /&gt;
        group[x] = y; /// unim grupele celor doua noduri&lt;br /&gt;
        apm[edg_apm++] = edg[i]; /// adaugam muchia la lista muchiilor ce formeaza arborele partial de cost minim&lt;br /&gt;
      }&lt;br /&gt;
    } /// la finalul algoritmului, vectorul apm[] va contine N - 1 elemente, muchiile ce formeaza un arbore partial de cost minim al grafului initial&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Varianta neoptimizata (muchii date sub forma unei liste, sortare de complexitate patratica) ===&lt;br /&gt;
Complexitate: &amp;#039;&amp;#039;O(M&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&amp;#039;&amp;#039; (complexitatea este cea data, intrucat sortarea de complexitate patratica duce la ignorarea complexitatii algoritmului union-find din punct de vedere al complexitatilor asimptotice)&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int MAXN = 1e5; /// numarul maxim de noduri&lt;br /&gt;
const int MAXM = 1e6; /// numarul maxim de muchii&lt;br /&gt;
&lt;br /&gt;
struct Edge { /// structura de muchii, x si y sunt cele doua noduri din capetele muchiei, c este costul&lt;br /&gt;
  int x, y, c;&lt;br /&gt;
  bool operator &amp;lt; (const Edge&amp;amp; other) const { /// comparatorul care sorteaza muchiile crescator dupa cost&lt;br /&gt;
     return c &amp;lt; other.c;&lt;br /&gt;
  }&lt;br /&gt;
} edg[MAXM], apm[MAXN];&lt;br /&gt;
&lt;br /&gt;
int group[MAXN + 1]; /// vectorul de tati in structura union-find&lt;br /&gt;
&lt;br /&gt;
int find_group(int node) { /// functia de gasire a grupei din structura union-find, fara compresia caii&lt;br /&gt;
  if (node != group[node]) /// cat timp nu am gasit reprezentantul grupei&lt;br /&gt;
   return find_group(group[node]); /// mergem recursiv din tata in tata pana il gasim&lt;br /&gt;
  return group[node];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
inline void my_sort(Edge v[], int n) { /// sortare in O(N^2), selection sort&lt;br /&gt;
  for (int i = n - 1; i &amp;gt; 0; --i)&lt;br /&gt;
    for (int j = 0; j &amp;lt; i; ++j)&lt;br /&gt;
      if (v[j] &amp;gt; v[i]) { /// algoritmul clasic, daca elementul de pe prefixul scanat este mai mare decat cel ce trebuie fixat le interschimbam&lt;br /&gt;
         Edge aux = v[i];&lt;br /&gt;
         v[i] = v[j];&lt;br /&gt;
         v[j] = aux;&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n, m;&lt;br /&gt;
    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m; /// citim numarul de noduri si de muchii&lt;br /&gt;
    for (int i = 0; i &amp;lt; m; ++i) /// citirea listei de muchii&lt;br /&gt;
      cin &amp;gt;&amp;gt; edg[i].x &amp;gt;&amp;gt; edg[i].y &amp;gt;&amp;gt; edg[i].c;&lt;br /&gt;
    my_sort(edg, m); /// sortarea muchiilor crescator dupa cost&lt;br /&gt;
    for (int i = 1; i &amp;lt;= n; ++i) /// initial toate nodurile formeaza grupe singulare&lt;br /&gt;
      group[i] = i;&lt;br /&gt;
    int edg_apm = 0; /// initial nu avem nicio muchie in arborele partial de cost minim&lt;br /&gt;
    for (int i = 0; i &amp;lt; m; ++i) { /// luam pe rand toate muchiile dupa ce le-am sortat&lt;br /&gt;
      int x = find_group(edg[i].x), y = find_group(edg[i].y); /// cautam reprezentatii nodurilor din capetele muchiei&lt;br /&gt;
      if (x != y) { /// daca sunt diferiti atunci inseamna ca muchia noastra trebuie adaugata la arborele partial de cost minim pe care il construim&lt;br /&gt;
        group[x] = y; /// unim grupele celor doua noduri&lt;br /&gt;
        apm[edg_apm++] = edg[i]; /// adaugam muchia la lista muchiilor ce formeaza arborele partial de cost minim&lt;br /&gt;
      }&lt;br /&gt;
    } /// la finalul algoritmului, vectorul apm[] va contine N - 1 elemente, muchiile ce formeaza un arbore partial de cost minim al grafului initial&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Varianta neoptimizata (muchii date sub forma unei liste) ===&lt;br /&gt;
Complexitate: &amp;#039;&amp;#039;O(M log M + M * N)&amp;#039;&amp;#039; (worst case - sortarea aduce termenul de M log M, in timp ce structura de union-find aduce pe cel de M * N, deoarece fara compresia cailor in cel mai rau caz se executa O(N) operatii pentru a cauta reprezentantul grupei)&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int MAXN = 1e5; /// numarul maxim de noduri&lt;br /&gt;
const int MAXM = 1e6; /// numarul maxim de muchii&lt;br /&gt;
&lt;br /&gt;
struct Edge { /// structura de muchii, x si y sunt cele doua noduri din capetele muchiei, c este costul&lt;br /&gt;
  int x, y, c;&lt;br /&gt;
  bool operator &amp;lt; (const Edge&amp;amp; other) const { /// comparatorul care sorteaza muchiile crescator dupa cost&lt;br /&gt;
     return c &amp;lt; other.c;&lt;br /&gt;
  }&lt;br /&gt;
} edg[MAXM], apm[MAXN];&lt;br /&gt;
&lt;br /&gt;
int group[MAXN + 1]; /// vectorul de tati in structura union-find&lt;br /&gt;
&lt;br /&gt;
int find_group(int node) { /// functia de gasire a grupei din structura union-find, fara compresia caii&lt;br /&gt;
  if (node != group[node]) /// cat timp nu am gasit reprezentantul grupei&lt;br /&gt;
   return find_group(group[node]); /// mergem recursiv din tata in tata pana il gasim&lt;br /&gt;
  return group[node];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n, m;&lt;br /&gt;
    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m; /// citim numarul de noduri si de muchii&lt;br /&gt;
    for (int i = 0; i &amp;lt; m; ++i) /// citirea listei de muchii&lt;br /&gt;
      cin &amp;gt;&amp;gt; edg[i].x &amp;gt;&amp;gt; edg[i].y &amp;gt;&amp;gt; edg[i].c;&lt;br /&gt;
    sort(edg, edg + m); /// sortarea muchiilor crescator dupa cost&lt;br /&gt;
    for (int i = 1; i &amp;lt;= n; ++i) /// initial toate nodurile formeaza grupe singulare&lt;br /&gt;
      group[i] = i;&lt;br /&gt;
    int edg_apm = 0; /// initial nu avem nicio muchie in arborele partial de cost minim&lt;br /&gt;
    for (int i = 0; i &amp;lt; m; ++i) { /// luam pe rand toate muchiile dupa ce le-am sortat&lt;br /&gt;
      int x = find_group(edg[i].x), y = find_group(edg[i].y); /// cautam reprezentatii nodurilor din capetele muchiei&lt;br /&gt;
      if (x != y) { /// daca sunt diferiti atunci inseamna ca muchia noastra trebuie adaugata la arborele partial de cost minim pe care il construim&lt;br /&gt;
        group[x] = y; /// unim grupele celor doua noduri&lt;br /&gt;
        apm[edg_apm++] = edg[i]; /// adaugam muchia la lista muchiilor ce formeaza arborele partial de cost minim&lt;br /&gt;
      }&lt;br /&gt;
    } /// la finalul algoritmului, vectorul apm[] va contine N - 1 elemente, muchiile ce formeaza un arbore partial de cost minim al grafului initial&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Varianta optima (union-find cu compresia caii, muchii date sub forma unei liste) ===&lt;br /&gt;
Complexitate: &amp;#039;&amp;#039;O(M log M)&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int MAXN = 1e5; /// numarul maxim de noduri&lt;br /&gt;
const int MAXM = 1e6; /// numarul maxim de muchii&lt;br /&gt;
&lt;br /&gt;
struct Edge { /// structura de muchii, x si y sunt cele doua noduri din capetele muchiei, c este costul&lt;br /&gt;
  int x, y, c;&lt;br /&gt;
  bool operator &amp;lt; (const Edge&amp;amp; other) const { /// comparatorul care sorteaza muchiile crescator dupa cost&lt;br /&gt;
     return c &amp;lt; other.c;&lt;br /&gt;
  }&lt;br /&gt;
} edg[MAXM], apm[MAXN];&lt;br /&gt;
&lt;br /&gt;
int group[MAXN + 1]; /// vectorul de tati in structura union-find&lt;br /&gt;
&lt;br /&gt;
int find_group(int node) { /// functia de gasire a grupei din structura union-find, cu tot cu compresia drumului&lt;br /&gt;
  if (node != group[node]) /// daca nu am gasit reprezentantul grupei&lt;br /&gt;
    group[node] = find_group(group[node]); /// cream o legatura de la nodul curent la reprezentant (compresia caii)&lt;br /&gt;
  return group[node];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n, m;&lt;br /&gt;
    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m; /// citim numarul de noduri si de muchii&lt;br /&gt;
    for (int i = 0; i &amp;lt; m; ++i) /// citirea listei de muchii&lt;br /&gt;
      cin &amp;gt;&amp;gt; edg[i].x &amp;gt;&amp;gt; edg[i].y &amp;gt;&amp;gt; edg[i].c;&lt;br /&gt;
    sort(edg, edg + m); /// sortarea muchiilor crescator dupa cost&lt;br /&gt;
    for (int i = 1; i &amp;lt;= n; ++i) /// initial toate nodurile formeaza grupe singulare&lt;br /&gt;
      group[i] = i;&lt;br /&gt;
    int edg_apm = 0; /// initial nu avem nicio muchie in arborele partial de cost minim&lt;br /&gt;
    for (int i = 0; i &amp;lt; m; ++i) { /// luam pe rand toate muchiile dupa ce le-am sortat&lt;br /&gt;
      int x = find_group(edg[i].x), y = find_group(edg[i].y); /// cautam reprezentatii nodurilor din capetele muchiei&lt;br /&gt;
      if (x != y) { /// daca sunt diferiti atunci inseamna ca muchia noastra trebuie adaugata la arborele partial de cost minim pe care il construim&lt;br /&gt;
        group[x] = y; /// unim grupele celor doua noduri&lt;br /&gt;
        apm[edg_apm++] = edg[i]; /// adaugam muchia la lista muchiilor ce formeaza arborele partial de cost minim&lt;br /&gt;
      }&lt;br /&gt;
    } /// la finalul algoritmului, vectorul apm[] va contine N - 1 elemente, muchiile ce formeaza un arbore partial de cost minim al grafului initial&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
* [https://www.infoarena.ro/problema/ninjago ninjago]&lt;br /&gt;
* [https://www.infoarena.ro/problema/elicoptere elicoptere]&lt;br /&gt;
* [https://www.infoarena.ro/problema/radiatie radiatie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bibliografie =&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Kruskal%27s_algorithm https://en.wikipedia.org/wiki/Kruskal%27s_algorithm]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
</feed>