快速查找算法:
当 id[p]==id[q] 时,p,q 连通。否则与id[p]相等的值都替换成id[q].
完整代码如下:
#include<stdio.h>
#define N 10
int main()
{
int i,t,p,q;
int id[N];
for(i=0;i<N;i++)
id[i]=i;
while(scanf("%d--%d",&p,&q)==2)
{
if(id[p]==id[q])
continue;
for(t=id[p],i=0;i<N;i++)
{
if(id[i]==t)
id[i]=id[q];
}
printf("%d %d\t",p,q);
for(i=0;i<N;i++)
printf("%d ",id[i]);
printf("\n");
}
return 0;
}
快速合并算法:
代码如下:
#include<stdio.h>
#define N 10
int main()
{
int i,j,p,q;
int id[N];
for(i=0;i<N;i++)
id[i]=i;
while(scanf("%d-%d",&p,&q)==2)
{
for(i=p; i!=id[i]; i=id[i]);
for(j=q; j!=id[j]; j=id[j]);
if(i==j)
continue;
id[i]=j;
printf("%d %d\t",p,q);
for(i=0;i<N;i++)
printf("%d ",id[i]);
printf("\n");
}
return 0;
}
加权快速合并算法:
代码如下:
#include<stdio.h>
#define N 10
int main()
{
int i,j,p,q;
int id[N],w[N];
for(i=0;i<N;i++)
{
id[i]=i;
w[i]=1;
}
while(scanf("%d-%d",&p,&q)==2)
{
for(i=p; i!=id[i]; i=id[i]);
for(j=q; j!=id[j]; j=id[j]);
if(i==j)
continue;
if(w[i]<w[j])
{
id[i]=j;
w[j]+=1;
}
else
{
id[j]=i;
w[i]+=1;
}
printf("%d %d\t",p,q);
for(i=0;i<N;i++)
printf("%d ",id[i]);
printf("\n");
}
return 0;
}
具体见《算法:C部分实现》
加权快速合并算法已经很完美了,因为其至多利用MlgN 条指令处理N个对象的M条边。