关于该题的一点疑惑
查看原帖
关于该题的一点疑惑
141335
qwq2519楼主2021/9/5 21:25

为什么读入建图后要对每个连通块求出每个块的直径,后面再逐渐合并。

而不能在建图的时候,合并的时候直接计算每个块的直径,用那个三种情况取max的方法。这样只有20tps

标准建图做法

	int u, v;
	rep(i, 1, m) {
		read(u);
		read(v);
		G.add(u, v);
		G.add(v, u);
		u = find(u);
		v = find(v);
		if(u != v)
			fa[u] = v;
	}

	rep(i, 1, n) {
		if(i == find(i))
			dia[i] = calcdiameter(i);
	}

我的20tps想法

	int u, v;
	rep(i, 1, m) {
		read(u);
		read(v);
		G.add(u, v);
		G.add(v, u);
		u = find(u);
		v = find(v);
		if(u == v) continue;
		fa[u] = v;

		int& d1 =  dia[u];
		int& d2 =  dia[v];
		d2 = max(max(d1, d2), (d1 + 1) / 2 + (d2 + 1) / 2 + 1);

	}
2021/9/5 21:25
加载中...