算法基础是一个整型数组,当且仅当第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 ", p, q); } return 0; }
没明白这是干什么用的,就是遍历,赋值而已