鉴于以下代码块,取自quickunion算法,我需要为方法find()添加一个循环,该方法链接从站点p到根的路径中的每个站点。我在这个网站上看到了一些其他类似的问题和答案,但答案似乎彼此不同,我不相信他们按照我尝试的方式执行压缩。任何帮助都将非常感谢!
public int find(int p)
{ //Find component name.
while (p != id[p]) p = id[p];
return p;
}
public void union(int p, int q)
{ //Give p and q the same root.
int i = find(p);
int j = find(q);
if (i==j) return;
id[i] = j;
count--;
}
答案 0 :(得分:0)
你可以用双循环来做,首先找到根,然后将所有东西设置为指向它。
public int find(int p)
{ int curr = p;
while (curr != id[curr]) curr = id[curr]; //find root
//at this point, curr is the root
while (p != id[p]) {
int next = id[p];
id[p] = curr; //remember, curr is the root
p = next;
}
}