logo

Prims algoritme for minimum spannning tre (MST)

Introduksjon til Prims algoritme:

Vi har diskutert Kruskals algoritme for Minimum Spanning Tree . I likhet med Kruskals algoritme, er Prims algoritme også en Grådig algoritme . Denne algoritmen starter alltid med en enkelt node og beveger seg gjennom flere tilstøtende noder, for å utforske alle de tilkoblede kantene underveis.

Algoritmen starter med et tomt spenntre. Tanken er å opprettholde to sett med toppunkter. Det første settet inneholder toppunktene som allerede er inkludert i MST, og det andre settet inneholder toppunktene som ennå ikke er inkludert. Ved hvert trinn vurderer den alle kantene som forbinder de to settene og velger minimumsvektkanten fra disse kantene. Etter å ha plukket kanten, flytter den det andre endepunktet av kanten til settet som inneholder MST.



En gruppe kanter som forbinder to sett med toppunkter i en graf kalles kutt i grafteori . Så, på hvert trinn i Prims algoritme, finn et kutt, velg minimumvektkanten fra snittet, og inkluder dette toppunktet i MST Set (settet som inneholder allerede inkluderte toppunkter).

Hvordan fungerer Prims algoritme?

Virkemåten til Prims algoritme kan beskrives ved å bruke følgende trinn:

Trinn 1: Bestem et vilkårlig toppunkt som startpunkt for MST.
Steg 2: Følg trinn 3 til 5 til det er hjørner som ikke er inkludert i MST (kjent som fringe vertex).
Trinn 3: Finn kanter som forbinder et hvilket som helst trepunkt med frynsende toppunkter.
Trinn 4: Finn minimum blant disse kantene.
Trinn 5: Legg den valgte kanten til MST hvis den ikke danner noen syklus.
Trinn 6: Returner MST og gå ut



Merk: For å bestemme en syklus kan vi dele toppunktene i to sett [ett sett inneholder toppunktene inkludert i MST og det andre inneholder kantpunktene.]

Anbefalt praksis Minimum Spanning Tree Prøv det!

Illustrasjon av Prims algoritme:

Tenk på følgende graf som et eksempel som vi må finne Minimum Spanning Tree (MST) for.

Eksempel på en graf

Eksempel på en graf



Trinn 1: For det første velger vi et vilkårlig toppunkt som fungerer som startpunktet til Minimum Spanning Tree. Her har vi valgt toppunkt 0 som startpunkt.

0 er valgt som startpunkt

0 er valgt som startpunkt

Steg 2: Alle kantene som forbinder den ufullstendige MST og andre hjørner er kantene {0, 1} og {0, 7}. Mellom disse to er kanten med minimumsvekt {0, 1}. Så ta med kanten og toppunktet 1 i MST.

1 er lagt til MST

1 er lagt til MST

Trinn 3: Kantene som forbinder den ufullstendige MST til andre hjørner er {0, 7}, {1, 7} og {1, 2}. Blant disse kantene er minimumsvekten 8 som er av kantene {0, 7} og {1, 2}. La oss her inkludere kanten {0, 7} og toppunktet 7 i MST. [Vi kunne også ha inkludert kant {1, 2} og toppunkt 2 i MST].

7 er lagt til i MST

7 er lagt til i MST

Trinn 4: Kantene som forbinder den ufullstendige MST med frynsepunktene er {1, 2}, {7, 6} og {7, 8}. Legg til kanten {7, 6} og toppunktet 6 i MST siden den har minst vekt (dvs. 1).

6 er lagt til i MST

6 er lagt til i MST

Trinn 5: Forbindelseskantene er nå {7, 8}, {1, 2}, {6, 8} og {6, 5}. Inkluder kant {6, 5} og toppunkt 5 i MST siden kanten har minimumsvekten (dvs. 2) blant dem.

Inkluder toppunkt 5 i MST

Inkluder toppunkt 5 i MST

Trinn 6: Blant de nåværende forbindelseskantene har kanten {5, 2} minimumsvekt. Så ta med den kanten og toppunktet 2 i MST.

Inkluder toppunkt 2 i MST

Inkluder toppunkt 2 i MST

Trinn 7: Forbindelseskantene mellom den ufullstendige MST og de andre kantene er {2, 8}, {2, 3}, {5, 3} og {5, 4}. Kanten med minimum vekt er kant {2, 8} som har vekt 2. Ta med denne kanten og toppunktet 8 i MST.

Legg til toppunkt 8 i MST

Legg til toppunkt 8 i MST

Trinn 8: Se her at kantene {7, 8} og {2, 3} begge har samme vekt som er minimum. Men 7 er allerede en del av MST. Så vi vil vurdere kanten {2, 3} og inkludere den kanten og toppunktet 3 i MST.

Inkluder toppunkt 3 i MST

Inkluder toppunkt 3 i MST

Trinn 9: Bare toppunktet 4 gjenstår å inkludere. Minimum vektet kant fra den ufullstendige MST til 4 er {3, 4}.

Inkluder toppunkt 4 i MST

Inkluder toppunkt 4 i MST

Den endelige strukturen til MST er som følger og vekten av kantene på MST er (4 + 8 + 1 + 2 + 4 + 2 + 7 + 9) = 37 .

Strukturen til MST dannet ved bruk av metoden ovenfor

Strukturen til MST dannet ved bruk av metoden ovenfor

Merk: Hvis vi hadde valgt kanten {1, 2} i det tredje trinnet, ville MST sett slik ut.

Strukturen til den alternative MST hvis vi hadde valgt kant {1, 2} i MST

Strukturen til den alternative MST hvis vi hadde valgt kant {1, 2} i MST

Hvordan implementere Prims algoritme?

Følg de angitte trinnene for å bruke Prims algoritme nevnt ovenfor for å finne MST for en graf:

  • Lag et sett mstSet som holder oversikt over hjørner som allerede er inkludert i MST.
  • Tilordne en nøkkelverdi til alle toppunktene i inndatagrafen. Initialiser alle nøkkelverdier som UENDELIG. Tilordne nøkkelverdien som 0 for det første toppunktet slik at det velges først.
  • Samtidig som mstSet inkluderer ikke alle hjørner
    • Velg et toppunkt i som ikke er der inne mstSet og har en minimum nøkkelverdi.
    • Inkludere i i mstSet .
    • Oppdater nøkkelverdien for alle tilstøtende hjørner av i . For å oppdatere nøkkelverdiene, iterer gjennom alle tilstøtende hjørner.
      • For hvert tilstøtende toppunkt i , hvis vekten av kanten u-v er mindre enn den forrige nøkkelverdien til i , oppdater nøkkelverdien som vekten av u-v .

Ideen med å bruke nøkkelverdier er å velge minimum vektkant fra kutte opp . Nøkkelverdiene brukes bare for toppunkter som ennå ikke er inkludert i MST, nøkkelverdien for disse toppunktene indikerer minimumsvektkantene som forbinder dem med settet med toppunkter inkludert i MST.

Nedenfor er implementeringen av tilnærmingen:

C++




// A C++ program for Prim's Minimum> // Spanning Tree (MST) algorithm. The program is> // for adjacency matrix representation of the graph> #include> using> namespace> std;> // Number of vertices in the graph> #define V 5> // A utility function to find the vertex with> // minimum key value, from the set of vertices> // not yet included in MST> int> minKey(>int> key[],>bool> mstSet[])> {> >// Initialize min value> >int> min = INT_MAX, min_index;> >for> (>int> v = 0; v if (mstSet[v] == false && key[v] min = key[v], min_index = v; return min_index; } // A utility function to print the // constructed MST stored in parent[] void printMST(int parent[], int graph[V][V]) { cout << 'Edge Weight '; for (int i = 1; i cout << parent[i] << ' - ' << i << ' ' << graph[i][parent[i]] << ' '; } // Function to construct and print MST for // a graph represented using adjacency // matrix representation void primMST(int graph[V][V]) { // Array to store constructed MST int parent[V]; // Key values used to pick minimum weight edge in cut int key[V]; // To represent set of vertices included in MST bool mstSet[V]; // Initialize all keys as INFINITE for (int i = 0; i key[i] = INT_MAX, mstSet[i] = false; // Always include first 1st vertex in MST. // Make key 0 so that this vertex is picked as first // vertex. key[0] = 0; // First node is always root of MST parent[0] = -1; // The MST will have V vertices for (int count = 0; count // Pick the minimum key vertex from the // set of vertices not yet included in MST int u = minKey(key, mstSet); // Add the picked vertex to the MST Set mstSet[u] = true; // Update key value and parent index of // the adjacent vertices of the picked vertex. // Consider only those vertices which are not // yet included in MST for (int v = 0; v // graph[u][v] is non zero only for adjacent // vertices of m mstSet[v] is false for vertices // not yet included in MST Update the key only // if graph[u][v] is smaller than key[v] if (graph[u][v] && mstSet[v] == false && graph[u][v] parent[v] = u, key[v] = graph[u][v]; } // Print the constructed MST printMST(parent, graph); } // Driver's code int main() { int graph[V][V] = { { 0, 2, 0, 6, 0 }, { 2, 0, 3, 8, 5 }, { 0, 3, 0, 0, 7 }, { 6, 8, 0, 0, 9 }, { 0, 5, 7, 9, 0 } }; // Print the solution primMST(graph); return 0; } // This code is contributed by rathbhupendra>

>

linux endre navn på mappen
>

C




// A C program for Prim's Minimum> // Spanning Tree (MST) algorithm. The program is> // for adjacency matrix representation of the graph> #include> #include> #include> // Number of vertices in the graph> #define V 5> // A utility function to find the vertex with> // minimum key value, from the set of vertices> // not yet included in MST> int> minKey(>int> key[],>bool> mstSet[])> {> >// Initialize min value> >int> min = INT_MAX, min_index;> >for> (>int> v = 0; v if (mstSet[v] == false && key[v] min = key[v], min_index = v; return min_index; } // A utility function to print the // constructed MST stored in parent[] int printMST(int parent[], int graph[V][V]) { printf('Edge Weight '); for (int i = 1; i printf('%d - %d %d ', parent[i], i, graph[i][parent[i]]); } // Function to construct and print MST for // a graph represented using adjacency // matrix representation void primMST(int graph[V][V]) { // Array to store constructed MST int parent[V]; // Key values used to pick minimum weight edge in cut int key[V]; // To represent set of vertices included in MST bool mstSet[V]; // Initialize all keys as INFINITE for (int i = 0; i key[i] = INT_MAX, mstSet[i] = false; // Always include first 1st vertex in MST. // Make key 0 so that this vertex is picked as first // vertex. key[0] = 0; // First node is always root of MST parent[0] = -1; // The MST will have V vertices for (int count = 0; count // Pick the minimum key vertex from the // set of vertices not yet included in MST int u = minKey(key, mstSet); // Add the picked vertex to the MST Set mstSet[u] = true; // Update key value and parent index of // the adjacent vertices of the picked vertex. // Consider only those vertices which are not // yet included in MST for (int v = 0; v // graph[u][v] is non zero only for adjacent // vertices of m mstSet[v] is false for vertices // not yet included in MST Update the key only // if graph[u][v] is smaller than key[v] if (graph[u][v] && mstSet[v] == false && graph[u][v] parent[v] = u, key[v] = graph[u][v]; } // print the constructed MST printMST(parent, graph); } // Driver's code int main() { int graph[V][V] = { { 0, 2, 0, 6, 0 }, { 2, 0, 3, 8, 5 }, { 0, 3, 0, 0, 7 }, { 6, 8, 0, 0, 9 }, { 0, 5, 7, 9, 0 } }; // Print the solution primMST(graph); return 0; }>

>

>

Java




// A Java program for Prim's Minimum Spanning Tree (MST)> // algorithm. The program is for adjacency matrix> // representation of the graph> import> java.io.*;> import> java.lang.*;> import> java.util.*;> class> MST {> >// Number of vertices in the graph> >private> static> final> int> V =>5>;> >// A utility function to find the vertex with minimum> >// key value, from the set of vertices not yet included> >// in MST> >int> minKey(>int> key[], Boolean mstSet[])> >{> >// Initialize min value> >int> min = Integer.MAX_VALUE, min_index = ->1>;> >for> (>int> v =>0>; v if (mstSet[v] == false && key[v] min = key[v]; min_index = v; } return min_index; } // A utility function to print the constructed MST // stored in parent[] void printMST(int parent[], int graph[][]) { System.out.println('Edge Weight'); for (int i = 1; i System.out.println(parent[i] + ' - ' + i + ' ' + graph[i][parent[i]]); } // Function to construct and print MST for a graph // represented using adjacency matrix representation void primMST(int graph[][]) { // Array to store constructed MST int parent[] = new int[V]; // Key values used to pick minimum weight edge in // cut int key[] = new int[V]; // To represent set of vertices included in MST Boolean mstSet[] = new Boolean[V]; // Initialize all keys as INFINITE for (int i = 0; i key[i] = Integer.MAX_VALUE; mstSet[i] = false; } // Always include first 1st vertex in MST. // Make key 0 so that this vertex is // picked as first vertex key[0] = 0; // First node is always root of MST parent[0] = -1; // The MST will have V vertices for (int count = 0; count 1; count++) { // Pick the minimum key vertex from the set of // vertices not yet included in MST int u = minKey(key, mstSet); // Add the picked vertex to the MST Set mstSet[u] = true; // Update key value and parent index of the // adjacent vertices of the picked vertex. // Consider only those vertices which are not // yet included in MST for (int v = 0; v // graph[u][v] is non zero only for adjacent // vertices of m mstSet[v] is false for // vertices not yet included in MST Update // the key only if graph[u][v] is smaller // than key[v] if (graph[u][v] != 0 && mstSet[v] == false && graph[u][v] parent[v] = u; key[v] = graph[u][v]; } } // Print the constructed MST printMST(parent, graph); } public static void main(String[] args) { MST t = new MST(); int graph[][] = new int[][] { { 0, 2, 0, 6, 0 }, { 2, 0, 3, 8, 5 }, { 0, 3, 0, 0, 7 }, { 6, 8, 0, 0, 9 }, { 0, 5, 7, 9, 0 } }; // Print the solution t.primMST(graph); } } // This code is contributed by Aakash Hasija>

>

>

Python3




# A Python3 program for> # Prim's Minimum Spanning Tree (MST) algorithm.> # The program is for adjacency matrix> # representation of the graph> # Library for INT_MAX> import> sys> class> Graph():> >def> __init__(>self>, vertices):> >self>.V>=> vertices> >self>.graph>=> [[>0> for> column>in> range>(vertices)]> >for> row>in> range>(vertices)]> ># A utility function to print> ># the constructed MST stored in parent[]> >def> printMST(>self>, parent):> >print>(>'Edge Weight'>)> >for> i>in> range>(>1>,>self>.V):> >print>(parent[i],>'-'>, i,>' '>,>self>.graph[i][parent[i]])> ># A utility function to find the vertex with> ># minimum distance value, from the set of vertices> ># not yet included in shortest path tree> >def> minKey(>self>, key, mstSet):> ># Initialize min value> >min> => sys.maxsize> >for> v>in> range>(>self>.V):> >if> key[v] <>min> and> mstSet[v]>=>=> False>:> >min> => key[v]> >min_index>=> v> >return> min_index> ># Function to construct and print MST for a graph> ># represented using adjacency matrix representation> >def> primMST(>self>):> ># Key values used to pick minimum weight edge in cut> >key>=> [sys.maxsize]>*> self>.V> >parent>=> [>None>]>*> self>.V># Array to store constructed MST> ># Make key 0 so that this vertex is picked as first vertex> >key[>0>]>=> 0> >mstSet>=> [>False>]>*> self>.V> >parent[>0>]>=> ->1> # First node is always the root of> >for> cout>in> range>(>self>.V):> ># Pick the minimum distance vertex from> ># the set of vertices not yet processed.> ># u is always equal to src in first iteration> >u>=> self>.minKey(key, mstSet)> ># Put the minimum distance vertex in> ># the shortest path tree> >mstSet[u]>=> True> ># Update dist value of the adjacent vertices> ># of the picked vertex only if the current> ># distance is greater than new distance and> ># the vertex in not in the shortest path tree> >for> v>in> range>(>self>.V):> ># graph[u][v] is non zero only for adjacent vertices of m> ># mstSet[v] is false for vertices not yet included in MST> ># Update the key only if graph[u][v] is smaller than key[v]> >if> self>.graph[u][v]>>0> and> mstSet[v]>=>=> False> > >and> key[v]>>self>.graph[u][v]:> >key[v]>=> self>.graph[u][v]> >parent[v]>=> u> >self>.printMST(parent)> # Driver's code> if> __name__>=>=> '__main__'>:> >g>=> Graph(>5>)> >g.graph>=> [[>0>,>2>,>0>,>6>,>0>],> >[>2>,>0>,>3>,>8>,>5>],> >[>0>,>3>,>0>,>0>,>7>],> >[>6>,>8>,>0>,>0>,>9>],> >[>0>,>5>,>7>,>9>,>0>]]> >g.primMST()> # Contributed by Divyanshu Mehta>

>

>

C#




// A C# program for Prim's Minimum> // Spanning Tree (MST) algorithm.> // The program is for adjacency> // matrix representation of the graph> using> System;> class> MST {> >// Number of vertices in the graph> >static> int> V = 5;> >// A utility function to find> >// the vertex with minimum key> >// value, from the set of vertices> >// not yet included in MST> >static> int> minKey(>int>[] key,>bool>[] mstSet)> >{> >// Initialize min value> >int> min =>int>.MaxValue, min_index = -1;> >for> (>int> v = 0; v if (mstSet[v] == false && key[v] min = key[v]; min_index = v; } return min_index; } // A utility function to print // the constructed MST stored in parent[] static void printMST(int[] parent, int[, ] graph) { Console.WriteLine('Edge Weight'); for (int i = 1; i Console.WriteLine(parent[i] + ' - ' + i + ' ' + graph[i, parent[i]]); } // Function to construct and // print MST for a graph represented // using adjacency matrix representation static void primMST(int[, ] graph) { // Array to store constructed MST int[] parent = new int[V]; // Key values used to pick // minimum weight edge in cut int[] key = new int[V]; // To represent set of vertices // included in MST bool[] mstSet = new bool[V]; // Initialize all keys // as INFINITE for (int i = 0; i key[i] = int.MaxValue; mstSet[i] = false; } // Always include first 1st vertex in MST. // Make key 0 so that this vertex is // picked as first vertex // First node is always root of MST key[0] = 0; parent[0] = -1; // The MST will have V vertices for (int count = 0; count // Pick the minimum key vertex // from the set of vertices // not yet included in MST int u = minKey(key, mstSet); // Add the picked vertex // to the MST Set mstSet[u] = true; // Update key value and parent // index of the adjacent vertices // of the picked vertex. Consider // only those vertices which are // not yet included in MST for (int v = 0; v // graph[u][v] is non zero only // for adjacent vertices of m // mstSet[v] is false for vertices // not yet included in MST Update // the key only if graph[u][v] is // smaller than key[v] if (graph[u, v] != 0 && mstSet[v] == false && graph[u, v] parent[v] = u; key[v] = graph[u, v]; } } // Print the constructed MST printMST(parent, graph); } // Driver's Code public static void Main() { int[, ] graph = new int[, ] { { 0, 2, 0, 6, 0 }, { 2, 0, 3, 8, 5 }, { 0, 3, 0, 0, 7 }, { 6, 8, 0, 0, 9 }, { 0, 5, 7, 9, 0 } }; // Print the solution primMST(graph); } } // This code is contributed by anuj_67.>

>

>

Javascript




> // Number of vertices in the graph> let V = 5;> // A utility function to find the vertex with> // minimum key value, from the set of vertices> // not yet included in MST> function> minKey(key, mstSet)> {> >// Initialize min value> >let min = Number.MAX_VALUE, min_index;> >for> (let v = 0; v if (mstSet[v] == false && key[v] min = key[v], min_index = v; return min_index; } // A utility function to print the // constructed MST stored in parent[] function printMST(parent, graph) { document.write('Edge Weight' + ' '); for (let i = 1; i document.write(parent[i] + ' - ' + i + ' ' + graph[i][parent[i]] + ' '); } // Function to construct and print MST for // a graph represented using adjacency // matrix representation function primMST(graph) { // Array to store constructed MST let parent = []; // Key values used to pick minimum weight edge in cut let key = []; // To represent set of vertices included in MST let mstSet = []; // Initialize all keys as INFINITE for (let i = 0; i key[i] = Number.MAX_VALUE, mstSet[i] = false; // Always include first 1st vertex in MST. // Make key 0 so that this vertex is picked as first vertex. key[0] = 0; parent[0] = -1; // First node is always root of MST // The MST will have V vertices for (let count = 0; count { // Pick the minimum key vertex from the // set of vertices not yet included in MST let u = minKey(key, mstSet); // Add the picked vertex to the MST Set mstSet[u] = true; // Update key value and parent index of // the adjacent vertices of the picked vertex. // Consider only those vertices which are not // yet included in MST for (let v = 0; v // graph[u][v] is non zero only for adjacent vertices of m // mstSet[v] is false for vertices not yet included in MST // Update the key only if graph[u][v] is smaller than key[v] if (graph[u][v] && mstSet[v] == false && graph[u][v] parent[v] = u, key[v] = graph[u][v]; } // print the constructed MST printMST(parent, graph); } // Driver code let graph = [ [ 0, 2, 0, 6, 0 ], [ 2, 0, 3, 8, 5 ], [ 0, 3, 0, 0, 7 ], [ 6, 8, 0, 0, 9 ], [ 0, 5, 7, 9, 0 ] ]; // Print the solution primMST(graph); // This code is contributed by Dharanendra L V.>

>

>

Produksjon

Edge Weight 0 - 1 2 1 - 2 3 0 - 3 6 1 - 4 5>

Kompleksitetsanalyse av Prims algoritme:

Tidskompleksitet: O(V2), Hvis inngangen grafen er representert ved hjelp av en tilstøtende liste , så kan tidskompleksiteten til Prims algoritme reduseres til O(E * logV) ved hjelp av en binær haug. I denne implementeringen vurderer vi alltid at spenntreet starter fra roten av grafen
Hjelpeplass: O(V)

Andre implementeringer av Prims algoritme:

Nedenfor er noen andre implementeringer av Prims algoritme

  • Prims algoritme for adjacency-matriserepresentasjon – I denne artikkelen har vi diskutert metoden for å implementere Prims algoritme hvis grafen er representert av en tilstøtende matrise.
  • Prims algoritme for representasjon av nabolister – I denne artikkelen er Prims algoritmeimplementering beskrevet for grafer representert av en tilstøtende liste.
  • Prims algoritme som bruker prioritert kø: I denne artikkelen har vi diskutert en tidseffektiv tilnærming for å implementere Prims algoritme.

Optimalisert tilnærming til PRIMS ALGORITIME:

Intuisjon

  1. Vi transformerer tilgrensningsmatrisen til tilgrensningsliste ved hjelp av ArrayList .
  2. Deretter lager vi en parklasse for å lagre toppunktet og dets vekt.
  3. Vi sorterer listen etter laveste vekt.
  4. Vi lager prioritert kø og skyver det første toppunktet og dets vekt i køen
  5. Så går vi bare gjennom kantene og lagrer den minste vekten i en variabel kalt år.
  6. Til slutt etter hele toppunktet returnerer vi ans.

Gjennomføring

C++


nettverkslag i datanettverk



#include> using> namespace> std;> typedef> pair<>int>,>int>>pii;> // Function to find sum of weights of edges of the Minimum Spanning Tree.> int> spanningTree(>int> V,>int> E,>int> edges[][3])> {> >// Create an adjacency list representation of the graph> >vectorint>> adj[V]; // Fyll tilgrensningslisten med kanter og deres vekt for (int i = 0; i int u = kanter[i][0]; int v = kanter[i][1]; int wt = kanter[i][2] ]; adj[u].push_back({v, wt}); adj[v].push_back({u, wt}); besøkt array for å holde styr på besøkte toppunkter vektor besøkt(V, usann); // Variabel for å lagre resultatet (summen av kantvekter) int res = 0; // Start med toppunkt 0 pq.push({0, 0}); // Utfør Prims algoritme for å finne Minimum Spanning Tree while(!pq.empty()){ auto p = pq.top(); pq.pop(); int wt = p.først; // Vekt av kanten int u = p.sekund; // Toppunkt koblet til kanten if(besøkt[u] == sant){ fortsett; // Hopp over hvis toppunktet allerede er besøkt } res += wt; // Legg til kantvekten til resultatet besøkt[u] = sant; // Merk toppunktet som besøkt // Utforsk de tilstøtende toppunktene for(auto v : adj[u]){ // v[0] representerer toppunktet og v[1] representerer kantvekten if(visited[v[0] ] == usann){ pq.push({v[1], v[0]}); // Legg til den tilstøtende kanten til prioritetskøen } } } return res; // Returner summen av kantvektene til Minimum Spanning Tree } int main() { int graph[][3] = {{0, 1, 5}, {1, 2, 3}, {0, 2, 1 }}; // Function call cout<< spanningTree(3, 3, graph) << endl; return 0; }>

>

>

Java




// A Java program for Prim's Minimum Spanning Tree (MST)> // algorithm. The program is for adjacency list> // representation of the graph> import> java.io.*;> import> java.util.*;> // Class to form pair> class> Pair>implements> Comparable> {> >int> v;> >int> wt;> >Pair(>int> v,>int> wt)> >{> >this>.v=v;> >this>.wt=wt;> >}> >public> int> compareTo(Pair that)> >{> >return> this>.wt-that.wt;> >}> }> class> GFG {> // Function of spanning tree> static> int> spanningTree(>int> V,>int> E,>int> edges[][])> >{> >ArrayList adj=>new> ArrayList();> >for>(>int> i=>0>;i { adj.add(new ArrayList()); } for(int i=0;i { int u=edges[i][0]; int v=edges[i][1]; int wt=edges[i][2]; adj.get(u).add(new Pair(v,wt)); adj.get(v).add(new Pair(u,wt)); } PriorityQueue pq = new PriorityQueue(); pq.add(new Pair(0,0)); int[] vis=new int[V]; int s=0; while(!pq.isEmpty()) { Pair node=pq.poll(); int v=node.v; int wt=node.wt; if(vis[v]==1) continue; s+=wt; vis[v]=1; for(Pair it:adj.get(v)) { if(vis[it.v]==0) { pq.add(new Pair(it.v,it.wt)); } } } return s; } // Driver code public static void main (String[] args) { int graph[][] = new int[][] {{0,1,5}, {1,2,3}, {0,2,1}}; // Function call System.out.println(spanningTree(3,3,graph)); } }>

>

>

Python3




import> heapq> def> tree(V, E, edges):> ># Create an adjacency list representation of the graph> >adj>=> [[]>for> _>in> range>(V)]> ># Fill the adjacency list with edges and their weights> >for> i>in> range>(E):> >u, v, wt>=> edges[i]> >adj[u].append((v, wt))> >adj[v].append((u, wt))> ># Create a priority queue to store edges with their weights> >pq>=> []> ># Create a visited array to keep track of visited vertices> >visited>=> [>False>]>*> V> ># Variable to store the result (sum of edge weights)> >res>=> 0> ># Start with vertex 0> >heapq.heappush(pq, (>0>,>0>))> ># Perform Prim's algorithm to find the Minimum Spanning Tree> >while> pq:> >wt, u>=> heapq.heappop(pq)> >if> visited[u]:> >continue> ># Skip if the vertex is already visited> >res>+>=> wt> ># Add the edge weight to the result> >visited[u]>=> True> ># Mark the vertex as visited> ># Explore the adjacent vertices> >for> v, weight>in> adj[u]:> >if> not> visited[v]:> >heapq.heappush(pq, (weight, v))> ># Add the adjacent edge to the priority queue> >return> res> ># Return the sum of edge weights of the Minimum Spanning Tree> if> __name__>=>=> '__main__'>:> >graph>=> [[>0>,>1>,>5>],> >[>1>,>2>,>3>],> >[>0>,>2>,>1>]]> ># Function call> >print>(tree(>3>,>3>, graph))>

>

>

C#




using> System;> using> System.Collections.Generic;> public> class> MinimumSpanningTree> {> >// Function to find sum of weights of edges of the Minimum Spanning Tree.> >public> static> int> SpanningTree(>int> V,>int> E,>int>[,] edges)> >{> >// Create an adjacency list representation of the graph> >Listint[]>> adj = new Listint[]>>(); for (int i = 0; i { adj.Add(ny liste ()); } // Fyll nabolisten med kanter og deres vekt for (int i = 0; i { int u = kanter[i, 0]; int v = kanter[i, 1]; int wt = kanter[i, 2] ; adj[u].Add(new int[] { v, wt });Add(new int[] { u, wt } } // Lag en prioritetskø for å lagre kanter med vektene deres Prioritetskø<(int, int)>pq = ny PriorityQueue<(int, int)>(); // Opprett en besøkt matrise for å holde styr på besøkte hjørner bool[] visited = new bool[V]; // Variabel for å lagre resultatet (summen av kantvekter) int res = 0; // Start med toppunkt 0 pq.Enqueue((0, 0)); // Utfør Prims algoritme for å finne Minimum Spanning Tree while (pq.Count> 0) { var p = pq.Dequeue(); int wt = p.Item1; // Vekt av kanten int u = p.Item2; // Vertex koblet til kanten if (besøkt[u]) { continue; // Hopp over hvis toppunktet allerede er besøkt } res += wt; // Legg til kantvekten til resultatet besøkt[u] = sant; // Merk toppunktet som besøkt // Utforsk de tilstøtende toppunktene foreach (var v i adj[u]) { // v[0] representerer toppunktet og v[1] representerer kantvekten hvis (!visited[v[0] ]]) { pq.Enqueue((v[1], v[0])); // Legg til den tilstøtende kanten til prioritetskøen } } } return res; // Returner summen av kantvektene til Minimum Spanning Tree } public static void Main() { int[,] graph = { { 0, 1, 5 }, { 1, 2, 3 }, { 0, 2, 1 } }; // Funksjonsanrop Console.WriteLine(SpanningTree(3, 3, graph)); } } // PriorityQueue implementering for C# public class PriorityQueue hvor T : IComparable { private List heap = new List(); offentlig int Count => heap.Count; public void Enqueue(T item) { heap.Add(item); int i = heap.Count - 1; while (i> 0) { int parent = (i - 1) / 2; if (heap[foreldre].CompareTo(heap[i])<= 0) break; Swap(parent, i); i = parent; } } public T Dequeue() { int lastIndex = heap.Count - 1; T frontItem = heap[0]; heap[0] = heap[lastIndex]; heap.RemoveAt(lastIndex); --lastIndex; int parent = 0; while (true) { int leftChild = parent * 2 + 1; if (leftChild>lastIndex) break; int rightChild = leftChild + 1; if (rightChild 0) leftChild = rightChild; if (heap[foreldre].CompareTo(heap[venstrebarn])<= 0) break; Swap(parent, leftChild); parent = leftChild; } return frontItem; } private void Swap(int i, int j) { T temp = heap[i]; heap[i] = heap[j]; heap[j] = temp; } } // This code is contributed by shivamgupta0987654321>

>

>

Javascript




class PriorityQueue {> >constructor() {> >this>.heap = [];> >}> >enqueue(value) {> >this>.heap.push(value);> >let i =>this>.heap.length - 1;> >while> (i>0) {> >let j = Math.floor((i - 1) / 2);> >if> (>this>.heap[i][0]>=>this>.heap[j][0]) {> >break>;> >}> >[>this>.heap[i],>this>.heap[j]] = [>this>.heap[j],>this>.heap[i]];> >i = j;> >}> >}> >dequeue() {> >if> (>this>.heap.length === 0) {> >throw> new> Error(>'Queue is empty'>);> >}> >let i =>this>.heap.length - 1;> >const result =>this>.heap[0];> >this>.heap[0] =>this>.heap[i];> >this>.heap.pop();> >i--;> >let j = 0;> >while> (>true>) {> >const left = j * 2 + 1;> >if> (left>i) {> >break>;> >}> >const right = left + 1;> >let k = left;> >if> (right <= i &&>this>.heap[right][0] <>this>.heap[left][0]) {> >k = right;> >}> >if> (>this>.heap[j][0] <=>this>.heap[k][0]) {> >break>;> >}> >[>this>.heap[j],>this>.heap[k]] = [>this>.heap[k],>this>.heap[j]];> >j = k;> >}> >return> result;> >}> >get count() {> >return> this>.heap.length;> >}> }> function> spanningTree(V, E, edges) {> >// Create an adjacency list representation of the graph> >const adj =>new> Array(V).fill(>null>).map(() =>[]);> >// Fill the adjacency list with edges and their weights> >for> (let i = 0; i const [u, v, wt] = edges[i]; adj[u].push([v, wt]); adj[v].push([u, wt]); } // Create a priority queue to store edges with their weights const pq = new PriorityQueue(); // Create a visited array to keep track of visited vertices const visited = new Array(V).fill(false); // Variable to store the result (sum of edge weights) let res = 0; // Start with vertex 0 pq.enqueue([0, 0]); // Perform Prim's algorithm to find the Minimum Spanning Tree while (pq.count>0) { const p = pq.dequeue(); const wt = p[0]; // Vekt av kanten const u = p[1]; // Vertex koblet til kanten if (besøkt[u]) { continue; // Hopp over hvis toppunktet allerede er besøkt } res += wt; // Legg til kantvekten til resultatet besøkt[u] = sant; // Merk toppunktet som besøkt // Utforsk de tilstøtende toppunktene for (konst v av adj[u]) { // v[0] representerer toppunktet og v[1] representerer kantvekten hvis (!visited[v[0] ]]) { pq.enqueue([v[1], v[0]]); // Legg til den tilstøtende kanten til prioritetskøen } } } return res; // Returner summen av kantvektene til Minimum Spanning Tree } // Eksempel på brukskonst graf = [[0, 1, 5], [1, 2, 3], [0, 2, 1]]; // Funksjonskall console.log(spanningTree(3, 3, graf));>

>

>

Produksjon

4>

Kompleksitetsanalyse av Prims algoritme:

Tidskompleksitet: O(E*log(E)) hvor E er antall kanter
Hjelpeplass: O(V^2) hvor V er antallet toppunkt

Prims algoritme for å finne minimumspenningtreet (MST):

Fordeler:

  1. Prims algoritme vil garantert finne MST i en tilkoblet, vektet graf.
  2. Den har en tidskompleksitet på O(E log V) ved å bruke en binær haug eller Fibonacci-haug, der E er antall kanter og V er antall toppunkter.
  3. Det er en relativt enkel algoritme å forstå og implementere sammenlignet med noen andre MST-algoritmer.

Ulemper:

  1. I likhet med Kruskals algoritme, kan Prims algoritme være treg på tette grafer med mange kanter, da den krever iterasjon over alle kanter minst én gang.
  2. Prims algoritme er avhengig av en prioritert kø, som kan ta opp ekstra minne og senke algoritmen på veldig store grafer.
  3. Valget av startnode kan påvirke MST-utgangen, noe som kanskje ikke er ønskelig i enkelte applikasjoner.