标签:联通 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 //***
标签:联通 void find color idt com 生成 div bool
原文地址:http://www.cnblogs.com/cshg/p/6067466.html