2017 3 25 c连通性问题

来源:互联网 发布:淘宝贷款额度突然没了 编辑:程序博客网 时间:2024/05/30 02:26

关于c算法在开篇的连通性问题的并集查找算法的总结

1-1连通性问题的快速查找解决方案

#include<stdio.h>#define N 10000main(){    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);    }return 0;}

用以下的代码替换while循环体

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);

快速并集的加权版本

用一个额外的数组sz完成维护的目的,为每个对象用id[i]==i来表示,即在关联树中节点的数量.因此并集运算可以连接两颗指定树中的较小者和较大者,以阻止树中长路径的增长

#include<stdio.h>#define N 10000main(){    int i,j,p,q,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);        }        return 0;}

对分路径进行压缩

代替for循环可以对分我们所遍历的路径长度结果是经过一个长运算序列后,树变得几乎扁平
for(i=p;i!-id[i];i=id[i])     id[i]=id[id[i]];for(j=q;j!=id[j];j=id[j]) ;if[j]=id[id[j]];


0 0
原创粉丝点击