北大暑期学习之并查集

来源:互联网 发布:服务器与数据库的区别 编辑:程序博客网 时间:2024/05/16 02:01

数组pre[]记录了每个点的前导点是什么,函数find是查找,join是合并

int pre[1000];

int find(int x)

{

int r=x;

while(r!=pre[r])

r=pre[r];

int i=x,j;

while(pre[i]!=r)

{

j=pre[i];

pre[i]=r;

i=j;

}

return r;

}

通分支合并起来

void join(int x,int y)

{

int fx=find(x),fy=find(y);

if(fx!=fy)

pre(fx)=fy;

}

 

N个不同的元素分布在若干互不相交集合中,需要进行以下3个操作:

1.合并两个集合

2.查询一个元素在那个集合

3.查询两个元素是否属于同一个集合

实际应用:

Int get_par(int u)

{

If(par[a]!=a)

Par[a]=get_par(par[a]);

Return par[a];

}

Int query(int a,int b)比较两个节点是否树的根节点相同

{

Return get_par(a)==get_par(b);

}

Void merge(int a,int b)

{

Par[get_par(a)]=get_par_par(b);

}

0 0
原创粉丝点击