《算法C语言实现》————快速-查找算法(quick-find algorithm)

  算法基础是一个整型数组,当且仅当第p个元素和第q个元素相等时,p和q时连通的。初始时,数组中的第i个元素的值为i,0<=i<N,为实现p与q的合并操作,我们遍历数组,把所有名为p的元素值改为q。我们也可以选择另外一种方式,把所有名为q的元素改为p。

  这个程序从标准输入读取小于N的非负整数对序列(对p-q表示"把对象β 连接到q"),并且输出还未连通的输入对。程序中使用数组id,每个元素表示一个对象,且具有以下性质,当且仅当p和q时连通的,id[p]和id[q]想等。为简化起见,定义N为编译时的常数。另一方面,也可以从输入得到它,并动态地为它分配id数组。

 

 

/*
@file   quickfind.c
@brief  利用快速查找算法来解决小规模的连通性问题
*/
#include <stdio.h>
#define N 1000

int main(void)
{
    int i, p, q, t;
    int id[N];
    //初始化对象集合中元素的初始值
    for (i = 0; i < N; i++) id[i] = i;
    //循环读入整数对
    while (scanf_s("%d-%d", &p, &q) == 2)
    {
        //如果对象p与q是连通的,则从标准输入读取下一对整数对
        if (id[p] == id[q]) continue;
        //如果id[p]与id[q]的值不相等,则说明p-q是新对
        //则将所有原本与id[p]元素值相等的所有元素连接到q
        for (t = id[p], i = 0; i < N; i++)
        {
            if (id[i] == t)
                id[i] = id[q];
        }
        //因为p-q是新对,所以输出这个对
        printf("New pair: %d-%d\n", p, q);
    }

    return 0;
}

没明白这是干什么用的,就是遍历,赋值而已

posted @ 2017-03-12 15:54  elliottc  阅读(4184)  评论(0编辑  收藏  举报