From b5728d24c44ba7d1cdedd2d8ca30bbd201d4a992 Mon Sep 17 00:00:00 2001 From: lucifer2307 <116935558+lucifer2307@users.noreply.github.com> Date: Sat, 29 Oct 2022 17:39:09 +0530 Subject: [PATCH] =?UTF-8?q?Create=20Prim=E2=80=99s=20Minimum.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Prim\342\200\231s Minimum.cpp" | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 "Advanced data structures/Prim\342\200\231s Minimum.cpp" diff --git "a/Advanced data structures/Prim\342\200\231s Minimum.cpp" "b/Advanced data structures/Prim\342\200\231s Minimum.cpp" new file mode 100644 index 00000000..aef02f1f --- /dev/null +++ "b/Advanced data structures/Prim\342\200\231s Minimum.cpp" @@ -0,0 +1,110 @@ +// 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 < V; v++) + if (mstSet[v] == false && key[v] < min) + 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 \tWeight\n"; + for (int i = 1; i < V; i++) + cout << parent[i] << " - " << i << " \t" + << graph[i][parent[i]] << " \n"; +} + +// 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 < V; 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; + parent[0] = -1; // First node is always root of MST + + // The MST will have V vertices + for (int count = 0; count < V - 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 < V; 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] < key[v]) + parent[v] = u, key[v] = graph[u][v]; + } + + // print the constructed MST + printMST(parent, graph); +} + +// Driver's code +int main() +{ + /* Let us create the following graph + 2 3 + (0)--(1)--(2) + | / \ | + 6| 8/ \5 |7 + | / \ | + (3)-------(4) + 9 */ + 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