并查集
2016-02-05 22:23
260 查看
快速并查集(Quick_Union)
直接将两者相连加权快速并查集(Weighted_quick_Union)
将权重少的并到权重大的树上带路径压缩的加权快速并查集(Weighted_quick_union_with_path_compression)
增加了路径压缩,使树尽可能扁平(测试文件样例:
10
4 3
3 8
6 5
9 4
2 1
8 9
5 0
7 2
6 1
1 0
6 7
)
#include<iostream> #include<fstream> #include<vector> #include<string> #include<time.h> using namespace std; int *parent; int size; vector<int>numberPair; int Quick_Union_find(int p) { while (p != parent[p]) p = parent[p]; return p; } void Quick_Union() { time_t start, end; time(&start); for (int i = 0; i < size; i++) parent[i] = i; for (vector<int>::iterator it = numberPair.begin(); it != numberPair.end(); it++) { int number1, number2, root1, root2; number1 = *it; number2 = *++it; root1 = Quick_Union_find(number1); root2 = Quick_Union_find(number2); if (root1 != root2) parent[root1] = root2; } int count = 0; for (int i = 0; i < size; i++) { if (parent[i] == i) count++; } time(&end); cout << "QU: " << count << " " << end - start << endl; } int Weighted_quick_Union_find(int p) { while (parent[p] >= 0) p = parent[p]; return p; } void Weighted_quick_Union() { time_t start, end; time(&start); for (int i = 0; i < size; i++) parent[i] = -1; for (vector<int>::iterator it = numberPair.begin(); it != numberPair.end(); it++) { int number1, number2,root1,root2; number1 = *it; number2 = *++it; root1 = Weighted_quick_Union_find(number1); root2 = Weighted_quick_Union_find(number2); if (root1 != root2) { if (parent[root1] < parent[root2]) { parent[root1] += parent[root2]; parent[root2] = root1; } else { parent[root2] += parent[root1]; parent[root1] = root2; } } } int count = 0; for (int i = 0; i < size; i++) { if (parent[i] <0) count++; } time(&end); cout << "WQU: " << count << " " << end - start << endl; } int Compression_find(int p) { int root; for (root = p; parent[root] >= 0; root = parent[root]); while (p != root) { int temp = parent[p]; parent[p] = root; p = temp; } return root; } void Weighted_quick_union_with_path_compression() { time_t start, end; time(&start); for (int i = 0; i < size; i++) parent[i] = -1; for (vector<int>::iterator it = numberPair.begin(); it != numberPair.end(); it++) { int number1, number2, root1, root2; number1 = *it; number2 = *++it; root1 = Compression_find(number1); root2 = Compression_find(number2); if (root1 != root2) { if (parent[root1] < parent[root2]) { parent[root1] += parent[root2]; parent[root2] = root1; } else { parent[root2] += parent[root1]; parent[root1] = root2; } } } int count = 0; for (int i = 0; i < size; i++) { if (parent[i] <0) count++; } time(&end); cout << "WQUPC: " << count << " " << end - start << endl; } int main() { cout << "请输入文件名: "; string filename; getline(cin,filename); ifstream fin; fin.open(filename); if (!fin.is_open()) { cerr << "cannot open " << filename << endl; return 1; } int number; fin >> size; parent = new int[size]; while (!fin.eof()) { fin >> number; numberPair.push_back(number); } fin.close(); Quick_Union(); Weighted_quick_Union(); Weighted_quick_union_with_path_compression(); system("pause"); return 0; }
相关文章推荐
- AIM Tech Round (Div. 2) D. Array GCD(dp)
- jQuery.extend函数详解--
- android MVC && MVP && MVVM分析和对比
- BZOJ2190 [SDOI2008]仪仗队(欧拉函数)
- USACO Canada Tour
- JQuery3(map,each,trim方法)
- 【LeetCode】9. Palindrome Number
- 深度实践嵌入式linux系统移植 光盘下载地址
- java提高篇(四)-----抽象类与接口
- #137 Single Number II
- junit4X系列--Exception
- junit4X系列--Exception
- 第五章 JVM垃圾收集器(1)
- 数据集参数取值构件
- HDU-1253 胜利大逃亡 (BFS)
- junit4X系列--Builder、Request与JUnitCore
- iOS-对话框的应用
- java中基本类型的参数传递和引用类型的参数传递
- 安卓开发——详解camera.rotate(x,y,z);的旋转方向
- junit4X系列--Builder、Request与JUnitCore