最小生成树(MST)的Kruskal实现
2017-08-03 20:52
381 查看
首先,要明确最小生成树(MST)的定义
最小生成树:一个有 N个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 N 个结点,并且有保持图连通的最少的边。
求一个图的最小生成树一般会有两种方法 :①Kruskal
②Prim
但是,在NOIP当中,大多数选手都会选择使用①方法
下面是Kruskal的主要思路:Kruskal算法是基于贪心算法来实现的,首先将各条边的权值按从小到大进行排序,然后按照顺序选择各条边,判断这条边的两个端点是否属于同一个集合,如果不在同一个集合内就将他们合并,知道所有边都在同一个集合内。这便会用到一个非常常用的数据结构 —— 并查集(Union-Find)。
下面是代码实现:
最小生成树:一个有 N个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 N 个结点,并且有保持图连通的最少的边。
求一个图的最小生成树一般会有两种方法 :①Kruskal
②Prim
但是,在NOIP当中,大多数选手都会选择使用①方法
下面是Kruskal的主要思路:Kruskal算法是基于贪心算法来实现的,首先将各条边的权值按从小到大进行排序,然后按照顺序选择各条边,判断这条边的两个端点是否属于同一个集合,如果不在同一个集合内就将他们合并,知道所有边都在同一个集合内。这便会用到一个非常常用的数据结构 —— 并查集(Union-Find)。
下面是代码实现:
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <ctime> #include <cmath> using namespace std; const int maxm = 5005; const int maxn = 200001; int father[maxn], n, m, ans; struct Node{ int u, v, w; }ch[maxn]; int find(int k){ if(k == father[k]) return k; else return father[k] = find(father[k]); } bool compare(Node a, Node b){ return a.w < b.w; } int main(){ cin >> n >> m; for(int i = 1; i <= m; i++) scanf("%d%d%d", &ch[i].u, &ch[i].v ,&ch[i].w); sort(ch + 1,ch + m + 1,compare); for(int i = 1; i <= n; i++) father[i] = i; for(int i = 1; i <= m; i++){ int x = find(ch[i].u), y = find(ch[i].v); if(x != y){ father[x] = y; //把x的父亲设为y ans += ch[i].w; } } int t 4000 emp = find(1); for(int i = 2; i <= n; i++){ if(find(i) != temp){ printf("orz"); return 0; } } printf("%d\n", ans); return 0; }
相关文章推荐
- java实现图的最小生成树(森林)MST克鲁斯卡尔(Kruskal)算法
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)
- 最小生成树之克鲁斯卡尔(Kruskal)算法实现,代码详解!!!!
- 最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法
- 图的遍历及最小生成树(prim,kruskal)的实现
- 算法导论 最小生成树MST-KRUSKAL
- HDU-1875 畅通工程再续-1162 - Eddy's picture(最小生成树,Kruskal 算法实现 )
- 并查集+Priority_Queu+Kruskal实现最小生成树
- POJ 1861 Network [最小生成树算法MST-kruskal 数据结构-并查集 union-find sets]
- 【算法】图论_最小生成树(MST)_Kruskal
- 最小生成树之kruskal方法实现 (java)
- POJ 1679 The Unique MST (Kruskal 判最小生成树是否唯一)
- C语言实现图的Kruskal最小生成树算法
- 最小生成树总结(prim、并查集和kruskal) C++实现
- poj 1789 最小生成树 kruskal实现
- 图 之 MST(最小生成树 — kruskal算法 )并查集实现
- 最小生成树MST的Kruskal算法+并查集(链表实现)划分连通分量和集合,并查集可以保存多个集合
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)
- POJ2349—最小生成树的Kruskal和Prim实现
- 最小生成树kruskal实现