为了对抗毒瘤数据,我们需要考虑到一切可能的情况,比如一个运输计划从自己的城市运输到自己的城市。这种情况下,我的lca木大大:
int length(int x, int y) {
int ans = 0;
if (d[x] < d[y]) swap(x, y);
int c = d[x] - d[y];
for (int i = 20; i >= 0; --i) {
if (c & (1 << i)) {
ans += sum[x][i];
x = f[x][i];
if (x == y) return ans;
}
}
for (int i = 20; i >= 0; --i) {
if (f[x][i] != f[y][i]) {
ans += sum[x][i];
ans += sum[y][i];
x = f[x][i];
y = f[y][i];
}
}
return ans + sum[x][0] + sum[y][0];
}
根据上面这段代码,if (x == y)
,这段代码会直接跳到return ans + sum[x][0] + sum[y][0];
,然后返回x, y存的边权。
但是,这个时候应该返回的是0,所以我们要加一个特殊情况:
int length(int x, int y) {
int ans = 0;
if (x == y) return ans;
if (d[x] < d[y]) swap(x, y);
int c = d[x] - d[y];
for (int i = 20; i >= 0; --i) {
if (c & (1 << i)) {
ans += sum[x][i];
x = f[x][i];
if (x == y) return ans;
}
}
for (int i = 20; i >= 0; --i) {
if (f[x][i] != f[y][i]) {
ans += sum[x][i];
ans += sum[y][i];
x = f[x][i];
y = f[y][i];
}
}
return ans + sum[x][0] + sum[y][0];
}
因为这个错误,WA了第十五个点。这给我以后的lca求路径很大的启示。