今天下午,我看我之前做这道题的代码,结果我发现一份代码 46 分,另一份 100 分:
// 其他部分都一样,只有 LCA 函数不同
// 46 pt:
int lca(int x, int y)
{
if (dep1[x] > dep1[y])
{
for (int i = 1; i <= dep1[x] - dep1[y]; ++i)
{
x = father[x];
}
}
else
{
for (int i = 1; i <= dep1[y] - dep1[x]; ++i)
{
y = father[y];
}
}
while (x != y)
{
x = father[x];
y = father[y];
}
return y;
}
// 100 pt:
int lca(int x, int y)
{
if (dep1[x] > dep1[y])
{
int num = dep1[x] - dep1[y]; // 所以要提前定义一个变量,记录循环范围!!!
for (int i = 1; i <= num; ++i) // 所以他们深度的差值也会改变!!!
{
x = father[x]; // 这里会改变 x 的值
}
}
else
{
int num = dep1[y] - dep1[x];
for (int i = 1; i <= num; ++i)
{
y = father[y];
}
}
while (x != y)
{
x = father[x];
y = father[y];
}
return y;
} // 警钟长鸣
这种小错误,我脑子坏了竟然能调一下午,要是考场上这样脑抽就废了