为什么读入建图后要对每个连通块求出每个块的直径,后面再逐渐合并。
而不能在建图的时候,合并的时候直接计算每个块的直径,用那个三种情况取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);
}