kruskal 并查集优化
2011-11-09 20:34
155 查看
这两天搞dp搞的快暴了,想学学网络流。拿过算导来一看,最短路还没整完呢。写了一个用并查集优化的kruskal算法,并查集是用非递归的状态压缩实现的。
详见:/article/5122274.html。
kruskal没有用堆优化,不是我不想,而是实在不会。。。所以直接用sort按权值排了下序,时间复杂度O(n+n*logn)
My Code:
附一组数据:
5 6
1 2 1
2 3 3
3 4 2
1 5 2
1 4 6
2 5 4
sum = 8
详见:/article/5122274.html。
kruskal没有用堆优化,不是我不想,而是实在不会。。。所以直接用sort按权值排了下序,时间复杂度O(n+n*logn)
My Code:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1000; struct EDG { int v; int u; int w; }edg ; int parent ; bool cmp(EDG a, EDG b) { return a.w < b.w; } void set() { for(int i = 0; i < N; i++) parent[i] = i; } int find_set(int n){ int k, i, r = n; while(parent[r] != r) { r = parent[r]; } k = n; while(k != r) { i = parent[k]; parent[k] = r; k = i; } return r; } int kruskal(int n) { int i, x, y, sum, cnt = 0; set(); for(sum = 0, i = 0; i < n && cnt < n-1; i++) { x = find_set(edg[i].u); y = find_set(edg[i].v); if(x == y) continue; parent[x] = parent[y]; ++cnt; sum += edg[i].w; } return sum; } int main() { //freopen("data.in", "r", stdin); int n, m, i, u, v, w; cin >> m >> n; for(i = 0; i < n; i++) { scanf("%d%d%d", &u, &v, &w); edg[i].v = v; edg[i].u = u; edg[i].w = w; } sort(edg, edg+n, cmp); cout << kruskal(n) << endl; return 0; }
附一组数据:
5 6
1 2 1
2 3 3
3 4 2
1 5 2
1 4 6
2 5 4
sum = 8
相关文章推荐
- POJ1789 Truck History Prim+堆(优先队列)、Kruskal(并查集)
- 求最小生成树(暴力法,prim,prim的堆优化,kruskal)
- POJ1251 Jungle Roads(Kruskal)(并查集)
- 并查集的优化
- 普林斯顿公开课 算法1-10:并查集-优化的快速合并方法
- 并查集-用并查集判断图中是否有环(能够应用到kruskal的最小生成树)
- POJ - 1251 Jungle Roads (最小生成树Kruskal、并查集)
- NYOJ 38布线问题(并查集)(最小生成树Kruskal)
- swust 1813 最小生成树 kruskal 并查集
- 最小生成树(Kruskal)(并查集)
- 畅通工程之最低成本建设问题(最小生成树(Kruskal)+并查集)
- bzoj 1171 并查集优化顺序枚举 | 线段树套单调队列
- CCF CSP认证 题解:201412-4 最优灌溉 Kruskal最小生成树+并查集(Java语言原创)
- HDU 1233 (最小生成树) 用并查集实现kruskal
- hdoj1233-还是畅通工程(并查集-kruskal && prim)
- 并查集实现-(秩优化+路径压缩+java)
- G - Supermarket ——贪心+并查集优化时间复杂度
- POJ-1456 Supermarket(贪心,并查集优化)
- 一个并查集问题的优化(CDOJ 203)
- uva_10034 Freckles Kruskal (使用并查集) 或Prim