前天学了一些简单的并查集。
并查集是对一些集合的合并。
可以快速确实某个元素属于哪个集合。
基本操作如下:
const int MAX = 10000;
int Father[MAX];
int rank[MAX];
//初始化所有集合
void Init()
{
for(int i = 0; i< MAX; ++i) Father[i] = i;
memset(rank,0,sizeof(rank));
}
//查找某个元素所属的集合
int find(int x)
{
if(x == Father[x]) return x;
Father[x] = find(Father[x]);
return Father[x];
}
//合并两个集合
void Union(int x,int y)
{
int rootx = find(x);
int rooty = find(y);
if(rootx == rooty) return ;
if(rank[x]>rank[y]) Father[y] = x;
else {
Father[x] = y;
if(rank[x] == rank[y]) rank[x]++;
}
}
PKU 上的并查集的题有: 1611,2492,1470
较难点的是有: 食物链