蒟蒻的错误点
查看原帖
蒟蒻的错误点
389540
imfkwk楼主2021/2/6 16:00

为了对抗毒瘤数据,我们需要考虑到一切可能的情况,比如一个运输计划从自己的城市运输到自己的城市。这种情况下,我的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求路径很大的启示。

2021/2/6 16:00
加载中...