本文是基于《算法(第四版)》中的Union Find讲解,采用C语言实现了Quick Find和Quick Union。
##1. 概述
给定N个对象,dynamic connectivity主要研究以下两个问题:
- 判断p和q是否相连。
- 连接两个对象p和q。
在建立模型时采用一维数组存放0~N-1个对象的信息,这样可以简化很多很UF无关的细节。
##2. Quick Find
假设把0~N-1个对象放在数组id[ ]中,每次读进来一对(p,q)时,如果相连的话就continue,如果不相连则通过把id[p]的内容改为id[q]的内容使它们连接起来。此时第1节中的两个问题等价于:
- id[p] ?= id[q]
- 把所有的id[p]都换成id[q]
代码如下:
#include <stdio.h>
#include <malloc.h>
bool query(int* id, int p, int q)
{
//判断id[p]和id[q]是否连通,是返回1,否返回0
return *(id + p) == *(id + q);
}
void union_command(int *id, int N, int p, int q)
{
int k;
int idp = *(id + p);
int idq = *(id + q);
for (k = 0; k < N; k++)
{
if (*(id + k) == idp)
*(id + k) = idq;
}
}
int main()
{
i