目标
判断给定的整数对p、q是否相连
API
public class UF | |
---|---|
UF(int N) | 以整数标识(0-N-1)初始化N个触点 |
void union(int p,int q) | 在p和q之间添加1条连接 |
bool connected(int p,int q) | 如果p和q存在于同一个分量中则返回true |
int count() | 连通分量的数量 |
C++实现
//union-find.h
#pragma once
#include<vector>
class UF{
public:
UF(int n) {
for (int i = 0; i < n; i++)
id.push_back(i);
}
int count_() const { return count; }
int find(int);
bool connected(int p, int q){ return find(p) == find(q); }
void union_(int, int);
static void main();
private:
std::vector<int> id;
int count;
};
// union-find.cpp
#include "stdafx.h"
#include "union-find.h"
#include<iostream>
using namespace std;
int UF::find(int p)
{
return id[p];
}
void UF::union_(int p, int q)
{
int pid = find(p), qid = find(q);
if (pid == qid)return;
for (int i = 0; i < id.size(); i++)
if (id[i] == pid)id[i] = qid;
count--;
}
void UF::main()
{
int n;
cin >> n;
UF uf(n);
while (cin)
{
int p, q;
cin >> p >> q;
if (uf.connected(p, q))continue;
uf.union_(p, q);
cout << p << " " << q << endl;
}
cout << uf.count << "components" << endl;
}
#include "stdafx.h"
#include"union-find.h"
int main()
{
UF::main();
return 0;
}
运行
在命令行中使用 < 重定向标准输入到文件
测试数据来自algs4-data\midumUF.txt