首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。