Bitdefender provides cybersecurity solutions with leading security efficacy, performance and ease of use to small and medium businesses, mid-market enterprises and consumers. Guided by a vision to be the world’s most trusted cybersecurity solutions provider, Bitdefender is committed to defending organizations and individuals around the globe against cyberattacks to transform and improve their digital experience.
Î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ă:
Se dă un graf neorientat și conex cu n noduri și m muchii (cu costuri oarecare pe muchii).
Folosiți algoritmul lui Kruskal pentru a găsi un MST.
Task-uri:
Restricții și precizări:
1s
7s
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.