并查集
(1)初始化:
for(int i=1;i<=n;i++)
father[i]=i;
因为每个元素属于单独的一个集合,所以每个元素以自己为根节点。
(2)寻找根节点编号并压缩路径:
int find(int x)
{
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
(3)合并两个集合:
void unionn(int x,int y)
{
x=find(x); y=find(y);
father[y]=x;
}
(4)判断元素是否属于一个集合:
bool judge(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)
return true;
return false;
}
从并查集中可以看到邻接表的影子。