## 算法与数据结构(1)------连通性问题
1:快速-查找算法
(注: 开发求解给定问题高效算法的过程的第一步是实现解这个问题的一个简单算法。在开发解决问题的第一个程序时更关注的是确保程序的正确性。)
当且仅当id[p]与id[q]相等时候,表示连通。
c语言实现如下:
#include <stdio.h>
#define N 10000
main()
{
int i,p,q,t,id[N];
for(i=0;i<N;i++) id[i]=i;
while(scanf("%d %d\n",&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\n",p,q);
}
//合并
//查找
}
2:快速合并算法
#include <stdio.h>
#define N 10000
main()
{
int i,p,q,t,id[N];
for(i=0;i<N;i++) id[i]=i;
while(scanf("%d %d\n",&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\n",p,q);
}
//合并
}
3:加权快速合并算法
#include <stdio.h>
#define N 10000
main()
{
int i,p,q,t,id[N],sz[N];
for(i=0;i<N;i++) {id[i]=i;sz[i]=1;}
while(scanf("%d %d\n",&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(sz[i]<sz[j])
{id[i]=j;sz[j]+=sz[i];}
else {id[j]=i;sz[i]+=sz[j];}
printf(" %d %d\n",p,q);
}
//合并
}
4:等分路径压缩
#include <stdio.h>
#define N 10000
main()
{
int i,p,q,t,id[N],sz[N];
for(i=0;i<N;i++) {id[i]=i;sz[i]=1;}
while(scanf("%d %d\n",&p,&q)==2)
{
for(i=p;i!=id[i];i=id[i])
id[i]=id[id[i]];
for(j=q;j!=id[j];j=id[j])
id[j]=id[id[j]];
if(i==j) continue;
if(sz[i]<sz[j])
{id[i]=j;sz[j]+=sz[i];}
else {id[j]=i;sz[i]+=sz[j];}
printf(" %d %d\n",p,q);
}
//合并
}