ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Kruskal最小生成树代码

2021-08-29 03:31:26  阅读:166  来源: 互联网

标签:struct subsets int graph Kruskal 最小 edges edge 代码


  1 // C program for Kruskal's algorithm to find Minimum
  2 // Spanning Tree of a given connected, undirected and
  3 // weighted graph
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 #include <string.h>
  7 
  8 // a structure to represent a weighted edge in graph
  9 struct Edge {
 10     int src, dest, weight;
 11 };
 12 
 13 // a structure to represent a connected, undirected
 14 // and weighted graph
 15 struct Graph {
 16     // V-> Number of vertices, E-> Number of edges
 17     int V, E;
 18 
 19     // graph is represented as an array of edges.
 20     // Since the graph is undirected, the edge
 21     // from src to dest is also edge from dest
 22     // to src. Both are counted as 1 edge here.
 23     struct Edge* edge;
 24 };
 25 
 26 // Creates a graph with V vertices and E edges
 27 struct Graph* createGraph(int V, int E)
 28 {
 29     struct Graph* graph = (struct Graph*)(malloc(sizeof(struct Graph)));
 30     graph->V = V;
 31     graph->E = E;
 32 
 33     graph->edge = (struct Edge*)malloc(sizeof( struct Edge)*E);
 34 
 35     return graph;
 36 }
 37 
 38 // A structure to represent a subset for union-find
 39 struct subset {
 40     int parent;
 41     int rank;
 42 };
 43 
 44 // A utility function to find set of an element i
 45 // (uses path compression technique)
 46 int find(struct subset subsets[], int i)
 47 {
 48     // find root and make root as parent of i
 49     // (path compression)
 50     if (subsets[i].parent != i)
 51         subsets[i].parent
 52             = find(subsets, subsets[i].parent);
 53 
 54     return subsets[i].parent;
 55 }
 56 
 57 // A function that does union of two sets of x and y
 58 // (uses union by rank)
 59 void Union(struct subset subsets[], int x, int y)
 60 {
 61     int xroot = find(subsets, x);
 62     int yroot = find(subsets, y);
 63 
 64     // Attach smaller rank tree under root of high
 65     // rank tree (Union by Rank)
 66     if (subsets[xroot].rank < subsets[yroot].rank)
 67         subsets[xroot].parent = yroot;
 68     else if (subsets[xroot].rank > subsets[yroot].rank)
 69         subsets[yroot].parent = xroot;
 70 
 71     // If ranks are same, then make one as root and
 72     // increment its rank by one
 73     else
 74     {
 75         subsets[yroot].parent = xroot;
 76         subsets[xroot].rank++;
 77     }
 78 }
 79 
 80 // Compare two edges according to their weights.
 81 // Used in qsort() for sorting an array of edges
 82 int myComp(const void* a, const void* b)
 83 {
 84     struct Edge* a1 = (struct Edge*)a;
 85     struct Edge* b1 = (struct Edge*)b;
 86     return a1->weight > b1->weight;
 87 }
 88 
 89 // The main function to construct MST using Kruskal's
 90 // algorithm
 91 void KruskalMST(struct Graph* graph)
 92 {
 93     int V = graph->V;
 94     struct Edge
 95         result[V]; // Tnis will store the resultant MST
 96     int e = 0; // An index variable, used for result[]
 97     int i = 0; // An index variable, used for sorted edges
 98 
 99     // Step 1: Sort all the edges in non-decreasing
100     // order of their weight. If we are not allowed to
101     // change the given graph, we can create a copy of
102     // array of edges
103     qsort(graph->edge, graph->E, sizeof(graph->edge[0]),
104         myComp);
105 
106     // Allocate memory for creating V ssubsets
107     struct subset* subsets
108         = (struct subset*)malloc(V * sizeof(struct subset));
109 
110     // Create V subsets with single elements
111     for (int v = 0; v < V; ++v) {
112         subsets[v].parent = v;
113         subsets[v].rank = 0;
114     }
115 
116     // Number of edges to be taken is equal to V-1
117     while (e < V - 1 && i < graph->E) {
118         // Step 2: Pick the smallest edge. And increment
119         // the index for next iteration
120         struct Edge next_edge = graph->edge[i++];
121 
122         int x = find(subsets, next_edge.src);
123         int y = find(subsets, next_edge.dest);
124 
125         // If including this edge does't cause cycle,
126         // include it in result and increment the index
127         // of result for next edge
128         if (x != y) {
129             result[e++] = next_edge;
130             Union(subsets, x, y);
131         }
132         // Else discard the next_edge
133     }
134 
135     // print the contents of result[] to display the
136     // built MST
137     printf(
138         "Following are the edges in the constructed MST\n");
139     int minimumCost = 0;
140     for (i = 0; i < e; ++i)
141     {
142         printf("%d -- %d == %d\n", result[i].src,
143             result[i].dest, result[i].weight);
144         minimumCost += result[i].weight;
145     }
146     printf("Minimum Cost Spanning tree : %d",minimumCost);
147     return;
148 }
149 
150 // Driver program to test above functions
151 int main()
152 {
153     /* Let us create following weighted graph
154             10
155         0--------1
156         | \      |
157        6|  5\    |15
158         |     \  |
159         2--------3
160             4     */
161     int V = 4; // Number of vertices in graph
162     int E = 5; // Number of edges in graph
163     struct Graph* graph = createGraph(V, E);
164 
165     // add edge 0-1
166     graph->edge[0].src = 0;
167     graph->edge[0].dest = 1;
168     graph->edge[0].weight = 10;
169 
170     // add edge 0-2
171     graph->edge[1].src = 0;
172     graph->edge[1].dest = 2;
173     graph->edge[1].weight = 6;
174 
175     // add edge 0-3
176     graph->edge[2].src = 0;
177     graph->edge[2].dest = 3;
178     graph->edge[2].weight = 5;
179 
180     // add edge 1-3
181     graph->edge[3].src = 1;
182     graph->edge[3].dest = 3;
183     graph->edge[3].weight = 15;
184 
185     // add edge 2-3
186     graph->edge[4].src = 2;
187     graph->edge[4].dest = 3;
188     graph->edge[4].weight = 4;
189 
190     KruskalMST(graph);
191 
192     return 0;
193 }
$gcc -o main *.c
$main
Following are the edges in the constructed MST 2 -- 3 == 4 0 -- 3 == 5 0 -- 1 == 10 Minimum Cost Spanning tree : 19

标签:struct,subsets,int,graph,Kruskal,最小,edges,edge,代码
来源: https://www.cnblogs.com/hulianxingkong/p/15201777.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有