我正在实施Kruskal算法,我找到了这段代码:
int findSet(int i)
{
return (pset[i]==i)? i:(pset[i]=findSet(pset[i]));
}
我不知道究竟是什么意思,请帮忙吗? :)
答案 0 :(得分:2)
?:
是conditional operator in C++。它等同于if-then-else
语句。所以这段代码相当于:
int findSet(int i)
{
if (pset[i]==i)
{
return i;
}
else
{
pset[i]=findSet(pset[i]));
return pset[i];
}
}
在Kruskal的算法中,这会找到其表示其参数的集合(即其祖先树的根)
答案 1 :(得分:1)
我认为三元运算符(?:)让您感到困惑,让我们用if-else替换它
int findSet(int i)
{
if (pset[i]==i)
return i;
else
{
pset[i]=findSet(pset[i]);
return pset[i];
}
}
希望你现在更清楚。
答案 2 :(得分:0)
看起来像find union算法实现(查找方法)。
例如 pset是具有父项索引的数组,例如: pset [] = {0,2,3,0}
所以我们知道索引1(pset 1)的父级是2,2的父级是3的父级3是0而0是根(因为parent[0] == 0
,更通用{{1 })。
算法find(i)始终返回根值,因此在此示例中始终为0。
在这个算法中,当我们找到根时,parent[i] == i
为真,我返回,否则我们通过执行遍历结构:
(pset[i]==i) ? i
分配是为了加快下一个查询find(i); 阅读一些关于不相交集数据结构的文章。