prim最小生成树代码

  1 // A C program for Prim's Minimum
  2 // Spanning Tree (MST) algorithm. The program is
  3 // for adjacency matrix representation of the graph
  4 #include <limits.h>
  5 #include <stdbool.h>
  6 #include <stdio.h>
  7 // Number of vertices in the graph
  8 #define V 5
  9 
 10 // A utility function to find the vertex with
 11 // minimum key value, from the set of vertices
 12 // not yet included in MST
 13 int minKey(int key[], bool mstSet[])
 14 {
 15     // Initialize min value
 16     int min = INT_MAX, min_index;
 17 
 18     for (int v = 0; v < V; v++)
 19         if (mstSet[v] == false && key[v] < min)
 20             min = key[v], min_index = v;
 21 
 22     return min_index;
 23 }
 24 
 25 // A utility function to print the
 26 // constructed MST stored in parent[]
 27 int printMST(int parent[], int graph[V][V])
 28 {
 29     printf("Edge \tWeight\n");
 30     for (int i = 1; i < V; i++)
 31         printf("%d - %d \t%d \n", parent[i], i, graph[i][parent[i]]);
 32 }
 33 
 34 // Function to construct and print MST for
 35 // a graph represented using adjacency
 36 // matrix representation
 37 void primMST(int graph[V][V])
 38 {
 39     // Array to store constructed MST
 40     int parent[V];
 41     // Key values used to pick minimum weight edge in cut
 42     int key[V];
 43     // To represent set of vertices included in MST
 44     bool mstSet[V];
 45 
 46     // Initialize all keys as INFINITE
 47     for (int i = 0; i < V; i++)
 48         key[i] = INT_MAX, mstSet[i] = false;
 49 
 50     // Always include first 1st vertex in MST.
 51     // Make key 0 so that this vertex is picked as first vertex.
 52     key[0] = 0;
 53     parent[0] = -1; // First node is always root of MST
 54 
 55     // The MST will have V vertices
 56     for (int count = 0; count < V - 1; count++) {
 57         // Pick the minimum key vertex from the
 58         // set of vertices not yet included in MST
 59         int u = minKey(key, mstSet);
 60 
 61         // Add the picked vertex to the MST Set
 62         mstSet[u] = true;
 63 
 64         // Update key value and parent index of
 65         // the adjacent vertices of the picked vertex.
 66         // Consider only those vertices which are not
 67         // yet included in MST
 68         for (int v = 0; v < V; v++)
 69 
 70             // graph[u][v] is non zero only for adjacent vertices of m
 71             // mstSet[v] is false for vertices not yet included in MST
 72             // Update the key only if graph[u][v] is smaller than key[v]
 73             if (graph[u][v] && mstSet[v] == false && graph[u][v] < key[v])
 74                 parent[v] = u, key[v] = graph[u][v];
 75     }
 76 
 77     // print the constructed MST
 78     printMST(parent, graph);
 79 }
 80 
 81 // driver program to test above function
 82 int main()
 83 {
 84     /* Let us create the following graph
 85        2     3
 86     (0)--(1)--(2)
 87     |   /  \    |
 88    6| 8/    \5  |7
 89     | /       \ |
 90     (3)-------(4)
 91           9         */
 92     int graph[V][V] = { { 0, 2, 0, 6, 0 },
 93                         { 2, 0, 3, 8, 5 },
 94                         { 0, 3, 0, 0, 7 },
 95                         { 6, 8, 0, 0, 9 },
 96                         { 0, 5, 7, 9, 0 } };
 97 
 98     // Print the solution
 99     primMST(graph);
100 
101     return 0;
102 }
$gcc -o main *.c
$main
Edge Weight 0 - 1 2 1 - 2 3 0 - 3 6 1 - 4 5
上一篇:Branch 向量化


下一篇:2021-7-29 Kefa and Park