首页 > 代码库 > kruskal

kruskal

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