算法基礎是一個整型數組,當且僅當第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; }
沒明白這是干什么用的,就是遍歷,賦值而已