我正在研究Quick-Union算法,但无法完全理解这段代码:
#include <stdio.h>
#define N 10000
main()
{
int i,p,t,id[N];
for (i = 0; i < N ; i++) id[i]= i;
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;
id [i] = j ;
}
}
我的主要问题是for
循环。如果满足condition
和init
,则增量语句会做什么?
注意:这不是教科书,而是我的代码!
答案 0 :(得分:1)
这是union-find数据结构的内联实现。 union-find数据结构将不相交的集合表示为树。它将每个节点的父节点存储在id
数组中。最初,每个节点都是它自己的父节点(形成一个单独的树)。这就是以下几行:
for (i = 0; i < N ; i++) id[i]= i;
使用
行for(i = p; i != id[i]; i = id[i]) ;
您遍历p
所在的树,直至其根。部分i = id[i]
将当前节点更改为当前节点的父节点。
q
也是如此。最后,如果两棵树不是同一棵树,它们就会被合并。
id [i] = j ;
答案 1 :(得分:-1)
首先根据标准
使用带有int的main函数的返回类型 for(i = 0; i&lt; N; i ++)id [i] = i;
此循环将所有值从0写入数组id[i]
。
while (scanf ("%d %d\n" , &p, &q) == 2)
{
for(i = p; i != id[i]; i = id[i]) ;
//在这个循环中,如果条件为真,它将从用户那里获取输入并检查是否在数组id中具有相同的索引,你将为i赋予索引中的值。
//如果没有满足条件,它将转到下一个循环
for (j = q; j != id[j]; j = id[j]) ;
//与上面的循环相同,输入不同。 if(i == j)继续; id [i] = j; }
答案 2 :(得分:-1)
这是一个解释,因为我理解代码:
#include <stdio.h>
#define N (10000)
int main( void )
{
int i;
int p;
int t;
int id[N];
// initialize array id[]
for (i = 0; i < N ; i++)
{
id[i]= i;
}
/*
* IMO:
* bad idea to be asking for two integers without prompting the user
* bad idea to use the two values without checking that they are in the range 0...(N-1)
* this code performs nothing useful
* the array id[] becomes more 'modified' the more numbers are entered
* */
// read two integers, if successful then
while (scanf ("%d %d\n" , &p, &q) == 2)
{
// looping, searching array id[] to see if properly initialized/updated
for(i = p; i != id[i]; i = id[i]) ;
// looping, searching array id[] to see if properly initialized/updated
for (j = q; j != id[j]; j = id[j]) ;
// when same value extracted from array id[] for both inputs then
// return to top of loop
if (i == j) continue;
// when not the same value, update array id[] with other value
id [i] = j ;
}
}