据我了解,当处理一对时,我们首先执行 FIND 操作并检查存在这些对象的树的根是否相等。在它们不相等的情况下,我们通过链接 2 个不同的根来执行 UNION 操作。
在 Sedgewick pg-15 property:1.2-"假设输入对的顺序是 1-2,然后是 2-3,然后是 3-4,依此类推。在 N-1 个这样的对之后,我们有 N 个对象都在同样的集合,快速联合算法形成的树是一条直线,N指向N-1,N-1指向N-2,N-3指向N-3,以此类推。”
根据我的说法,形成的树有根 1,从 2 到 N 的所有其他对象都是它的孩子——当我们扫描 1-2 时,有根本身,所以我们将它们链接起来,当我们扫描 2-3 时,2 的根是1 3 的根是 3 本身,所以我们链接 1 和 3 而不是 2 和 3。
在这种情况下,树怎么可能是一条直线?
#include <stdio.h>
#define N 10000
main()
{ int i, p, q, t, id[NJ;
for (i = 0; i < N; i++) id[i] = i;
while (scanfC"%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);
}
}