您的位置:首页 > 其它

并查集

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: