1.5.1
1.5.2
1.5.3
1.5.4
1.5.7
#pragma once
class QuickFindUF
{
private:
int* id;
int arraySize;
int count;
public:
QuickFindUF(int N);
~QuickFindUF();
void unionPQ(int p, int q);
int find(int p) const;
bool connected(int p, int q) const;
int remain() const;
};
#include "stdafx.h"
#include "QuickFindUF.h"
QuickFindUF::QuickFindUF(int N)
{
arraySize = N;
count = N;
id = new int[N];
for (int i = 0; i < N; i++)
id[i] = i;
}
int QuickFindUF::remain() const
{
return count;
}
bool QuickFindUF::connected(int p, int q) const
{
return find(p) == find(q);
}
int QuickFindUF::find(int p) const
{
return id[p];
}
void QuickFindUF::unionPQ(int p, int q)
{
int pID = find(p);
int qID = find(q);
if (pID == qID) return;
for (int i = 0; i < arraySize; i++)
if (id[i] == qID) id[i] = pID;
count--;
}
QuickFindUF::~QuickFindUF()
{
delete[] id;
}
#include "stdafx.h"
#include "QuickFindUF.h"
#include "string"
#include "vector"
#include "iostream"
#include "fstream"
int main()
{
std::ifstream in("G:\\数据结构与算法\\算法第四版\\tinyUF.txt");
int size;
in >> size;
QuickFindUF uf(size);
int p, q;
while (in >> p >> q)
{
if (uf.connected(p, q))
continue;
uf.unionPQ(p, q);
std::cout << p << " " << q<<std::endl;
}
std::cout << uf.remain() << " components";
system("pause");
}
#pragma once
class QuickUnionUF
{
private:
int* id;
int arraySize;
int count;
public:
QuickUnionUF(int N);
~QuickUnionUF();
void unionPQ(int p, int q);
int find(int p) const;
bool connected(int p, int q) const;
int remain() const;
};
#include "stdafx.h"
#include "QuickUnionUF.h"
QuickUnionUF::QuickUnionUF(int N)
{
arraySize = N;
count = N;
id = new int[N];
for (int i = 0; i < N; i++)
id[i] = i;
}
int QuickUnionUF::remain() const
{
return count;
}
bool QuickUnionUF::connected(int p, int q) const
{
return find(p) == find(q);
}
int QuickUnionUF::find(int p) const
{
while (p != id[p]) p = id[p];
return p;
}
void QuickUnionUF::unionPQ(int p, int q)
{
int i = find(p);
int j = find(q);
if (i == j) return;
id[j] = i;
count--;
}
QuickUnionUF::~QuickUnionUF()
{
delete[] id;
}
#include "stdafx.h"
#include "QuickFindUF.h"
#include "QuickUnionUF.h"
#include "string"
#include "vector"
#include "iostream"
#include "fstream"
int main()
{
std::ifstream in("G:\\数据结构与算法\\算法第四版\\tinyUF.txt");
int size;
in >> size;
QuickUnionUF uf(size);
int p, q;
while (in >> p >> q)
{
if (uf.connected(p, q))
continue;
uf.unionPQ(p, q);
std::cout << p << " " << q<<std::endl;
}
std::cout << uf.remain() << " components";
system("pause");
}
1.5.8
当i>=p时,并未改变后续内容。
1.5.9
5->6 和 6->1有问题
1.5.11
减少了每次需要改变元素的个数
1.5.12
#pragma once
class QuickUnionUF
{
private:
int* id;
int arraySize;
int count;
public:
QuickUnionUF(int N);
~QuickUnionUF();
void unionPQ(int p, int q);
int find(int p) const;
bool connected(int p, int q) const;
int remain() const;
};
#include "stdafx.h"
#include "QuickUnionUF.h"
QuickUnionUF::QuickUnionUF(int N)
{
arraySize = N;
count = N;
id = new int[N];
for (int i = 0; i < N; i++)
id[i] = i;
}
int QuickUnionUF::remain() const
{
return count;
}
bool QuickUnionUF::connected(int p, int q) const
{
return find(p) == find(q);
}
int QuickUnionUF::find(int p) const
{
int x = p;
while (x != id[x]) x = id[x];
while (p != id[p])
{
int tmp = p;
p = id[p];
id[tmp] = x;
}
return x;
}
void QuickUnionUF::unionPQ(int p, int q)
{
int i = find(p);
int j = find(q);
if (i == j) return;
id[j] = i;
count--;
}
QuickUnionUF::~QuickUnionUF()
{
delete[] id;
}
1.5.13
#pragma once
class WeightedQuickUnion
{
private:
int count;
int* id;
int* sz;
int arraySize;
public:
WeightedQuickUnion(int N);
int size();
int find(int p);
void unionPQ(int p, int q);
bool connected(int p, int q)
{
return find(p) == find(q);
}
~WeightedQuickUnion();
};
#include "stdafx.h"
#include "WeightedQuickUnion.h"
WeightedQuickUnion::WeightedQuickUnion(int N)
{
count = N;
arraySize = N;
id = new int[N];
for (int i = 0; i < N; i++)
id[i] = i;
sz = new int[N];
for (int i = 0; i < N; i++)
sz[i] = 1;
}
WeightedQuickUnion::~WeightedQuickUnion()
{
delete[] id;
delete[] sz;
}
int WeightedQuickUnion::size()
{
return count;
}
int WeightedQuickUnion::find(int p)
{
int x = p;
while (x != id[x]) x = id[x];
while (p != id[p])
{
int tmp = p;
p = id[p];
id[tmp] = x;
}
return x;
}
void WeightedQuickUnion::unionPQ(int p, int q)
{
int i = find(p);
int j = find(q);
if (sz[i] <= sz[j])
{
id[i] = j;
sz[j] += sz[i];
}
else
{
id[j] = i;
sz[i] += sz[j];
}
count--;
}
1.5.14
void WeightedQuickUnion::unionPQ(int p, int q)
{
int i = find(p);
int j = find(q);
if (sz[i] <= sz[j])
{
id[i] = j;
sz[j] = std::max(sz[j],sz[i]+1);
}
else
{
id[j] = i;
sz[i] = std::max(sz[i], sz[j] + 1);
}
count--;
}
1.5.17
int main()
{
Timer timer;
int total = 0;
srand((unsigned)time(NULL));
int size;
std::cin >> size;
WeightedQuickUnion uf(size);
while (uf.remain() > 1)
{
int p = rand() % size;
int q = rand() % size;
if (uf.connected(p, q))
continue;
uf.unionPQ(p, q);
std::cout << p << " " << q << std::endl;
total++;
}
std::cout << total << " links" << std::endl;
timer.stop();
system("pause");
}
1.5.18