码迷,mamicode.com
首页 > 其他好文 > 详细

kruskal

时间:2016-11-15 23:12:40      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:联通   void   find   color   idt   com   生成   div   bool   

kruskal 时间复杂度 O(|E| * log|V|)

按权值顺序依次判断,如果不产生圈则放进去

时间主要用在边的排序

代码来自《挑战编程》

 1 const int MAX_E = 100;
 2 const int MAX_V = 30;
 3 
 4 struct edge {
 5     int u, v, cost;
 6 };
 7 bool comp(const edge &a, const edge &b) {
 8     return a.cost < b.cost;
 9 }
10 edge es[MAX_E];
11 int V, E;
12 void add(int _u, int _v, int _cost) {
13     es[E].u = _u;
14     es[E].v = _v;
15     es[E].cost = _cost;
16     E++;
17 }
18 //并查集 判断联通性
19 //***
20 int par[MAX_V];
21 int ran[MAX_V];
22 void init() {
23     for(int i = 0; i < V; i++) par[i] = i, ran[i] = 0;
24 }
25 int finds(int x) {
26     if(par[x] == x) return x;
27     return par[x] = finds(par[x]);
28 }
29 void unite(int x, int y) {
30     x = finds(x), y = finds(y);
31     if(x == y) return;
32     if(ran[x] < ran[y]) par[x] = y;
33     else {
34         par[y] = x;
35         if(ran[x] == ran[y]) ran[x]++;
36     }
37 
38 }
39 bool same(int x, int y) {
40     return finds(x) == finds(y);
41 }
42 //***
43 
44 //kruskal 最小生成树
45 //***
46 int kruskal() {
47     sort(es, es+E, comp);
48     init();
49     int res = 0;
50     for(int i = 0; i < E; i++) {
51         edge e = es[i];
52         if(!same(e.u, e.v)) {
53             unite(e.u, e.v);
54             //printf("%d %d %d\n", e.u, e.v, e.cost);
55             res += e.cost;
56         }
57     }
58     return res;
59 }
60 //***

 

kruskal

标签:联通   void   find   color   idt   com   生成   div   bool   

原文地址:http://www.cnblogs.com/cshg/p/6067466.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!