This is an old revision of the document!
Bitdefender este un lider recunoscut în domeniul securității IT, care oferă soluții superioare de prevenție, detecție și răspuns la incidente de securitate cibernetică. Milioane de sisteme folosite de oameni, companii și instituții guvernamentale sunt protejate de soluțiile companiei, ceea ce face Bitdefender unul dintre cei mai de încredere experți în combaterea amenințărilor informatice, în protejarea intimității și datelor, a identității digitale și în consolidarea rezilienței la atacuri. Compania a inovat constant în domenii precum antimalware, Internetul Lucrurilor, analiză comportamentală și inteligență artificială, iar tehnologiile Bitdefender sunt licențiate către peste 180 dintre cele mai cunoscute branduri de securitate din lume.
În acest laborator vom introduce contextul pentru minimum spanning tree problem și vom studia algoritmi care pot rezolva această problemă.
Algoritmii pentru determinarea unor arbori (minimi) de acoperire au multiple aplicații practice. Câteva exemple de aplicații sunt:
Puteți consulta capitolul Minimum Spanning Trees din Introduction to Algorithms [0] pentru mai multe definiții formale. Această secțiune sumarizează principalele notații folosite în laboratoarele de PA.
Cele mai uzuale notații din laboratoarele de grafuri sunt descrise în Precizări laboratoare 07-12 (ex. $n$, $m$, $adj$, $adj\_trans$, $(x, y)$, etc).
Vom adăuga alte notații în continuarea celor introduse anterior.
Arbore de acoperire / spanning tree: Într-un graf neorientat conex $G = (V, E)$, cu funcția de cost $w: E -> W$, numim un arbore de acoperire un subgraf al lui G cu număr minim de muchii și care interconectează toate nodurile din graf.
Pădure de arbori de acoperire / spanning tree forest: Se definește similar, dar pentru graf neorientat neconex. Fiecare componentă conexă are un arbore de acoperire / spanning tree. Spunem că acești arbori formează împreună o pădure (forest).
Arbore minim de acoperire (AMA)/ minimum spanning tree (MST): Un arbore de acoperire este ȘI arbore minim de acoperire dacă costul total al muchiilor din arbore este minim posibil. Analog se poate defini și noțiunea de pădure de arbori minimi de acoperire (pornind de la cea de pădure de arbori de acoperire).
Pentru minimum spanning tree problem există mai mulți algoritmi, dintre care amintim:
În acest laborator vom studia și vom implementa algoritmul lui Kruskal. De asemenea, oferim ca studiu de caz pentru acasă, un material pentru algoritmul lui Prim.
Algoritmul lui Joseph Bernard **Kruskal** (Kruskal’s algorithm) rezolvă minimum spanning tree problem în grafuri neorientate G = (V, E) cu costurile muchiilor oarecare aplicând o strategie greedy foarte simplă: muchiile de cost minim probabil fac parte din MST!
Algoritmul lui Kruskal folosește o structură de date care suportă 2 operații:
Se pot folosi mai multe structuri de date. Pentru o implementare eficientă, alegem DisjointSet. Vă recomandăm să parcurgeți DisjointSet. ATENȚIE! Scheletul de laborator oferă o astfel de implementare.
// apply Kruskal's algorithm for computing a Minimum Spanning Tree (MST). // // nodes = list of all nodes from G // edges = the list of all edges in G // example: edge (node, neigh, weight) // // returns: cost, mst // cost = the cost of the MST // mst = the actual set of edges in MST // Kruskal(G=(nodes, edges)) { // STEP 0: initialize results cost = 0; // cost of the built MST mst = {}; // the actual set of edges (u, v) in the built MST // STEP 1: initialize disjoint set data structure // (a tree is created for each node) disjointset = DisjointSet(nodes); // STEP 2: sort(edges, compare=nondecreasing order by weight); // STEP 3: Add edge by edge to MST if no cycles are created. foreach ( (u, v, w) in edges ) { // STEP 3.1: Check if u anv v are in different trees. if (disjointset.setOf(u) != disjointset.setOf(v)) { // STEP 3.2: Merge these 2 trees (no cycles created). disjointset.union(u, v); // STEP 3.3: Extend MST with the current edge. cost += w; mst += { (u, v) }; } } return cost, mst; } // Usage example: cost, mst = Kruskal(G=(nodes, edges)); // 1. Use cost of MST. // 2. Use edges of MST (e.g. actually build the tree).
Algoritmul lui Kruskal pornește cu structura de date Păduri de mulțimi disjuncte inițializată cu n noduri izolate. Muchiile sunt sortate crescător după cost și se încearcă adăugarea lor, rând pe rând la pădurea de arbori.
Algoritmul lui Robert C **Prim** (Prim’s algorithm) rezolvă minimum spanning tree problem în grafuri neorientate G = (V, E) cu costurile muchiilor oarecare aplicând o strategie constructivă greedy, asemănătoare cu algoritmul lui Dijkstra: merge pe muchiile de cost minim, din aproape în aproape, considerând o sursă inițial aleasă aleator și extinzând MST-ul curent cu muchia de cost minim neadăugată încă la arbore.
Scheletul de laborator se găsește pe pagina pa-lab::skel/lab11.
Înainte de a rezolva exercițiile, asigurați-vă că ați citit și înțeles toate precizările din secțiunea Precizari laboratoare 07-12.
Prin citirea acestor precizări vă asigurați că:
Enunț: Se dau N puncte în plan. Costul conectării a două puncte este distanța Manhattan dintre acestea. Se cere costul minim pentru a conecta toate punctele.
Date de intrare: Vectorul de puncte (x, y).
Date de ieșire: Costul minim necesar pentru conectarea tuturor punctelor.
Problema se poate testa la: \ LeetCode - Min Cost to Connect All Points
Enunț: Există N orașe și M drumuri bidirecționale cu costuri de reparație. Se cere costul minim necesar pentru a face posibilă deplasarea între oricare două orașe. Dacă acest lucru nu este posibil, se va afișa IMPOSSIBLE.
Date de intrare: Numerele N și M, urmate de M muchii ponderate.
Date de ieșire: Costul minim al arborelui minim de acoperire sau IMPOSSIBLE.
Problema se poate testa la: \ CSES - Road Reparation
Enunț: Se dă un graf ponderat conex. Pentru fiecare muchie trebuie determinat dacă este:
critică (apare în orice MST), pseudo-critică (poate apărea într-un MST).
Date de intrare: Numărul de noduri și lista muchiilor ponderate.
Date de ieșire: Două liste:
muchiile critice muchiile pseudo-critice
Problema se poate testa la: \ LeetCode - Critical and Pseudo-Critical Edges in Minimum Spanning Tree
La acest laborator, asistentul va alege 1-2 probleme din secțiunea extra.
[0] Chapters Minimum Spanning Trees, “Introduction to Algorithms”, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein.
[1] A Randomized Linear-Time Algorithm to Find Minimum Spanning Trees, David R. Karger, Philip N. Klein, Robert E. Tarjan.
[2] A Minimum Spanning Tree Algorithm with InverseAckermann Type Complexity|, Bernard, Chazelle.