奥赛一本通 1437 扩散
1437 扩散
题目大意
给定平面上的 $n$ 个点,每过一个单位时间每个点都会向四个方向扩散一个距离,求它们形成连通块的最短时间。
知识要点
二分、并查集
解题思路
两个点之间直接连通的时间就是它们曼哈顿距离的一半,可以二分枚举时间,利用并查集检查是否所有节点均连通。
参考代码
#include <bits/stdc++.h>
using namespace std;
int n, x[55], y[55], fa[55];
int find(int x) {
if(fa[x] == x) return x;
return fa[x] = find(fa[x]);
}
bool check(int t) {
for(int i = 1; i <= n; i++) fa[i] = i;
for(int i = 1; i <= n; i++) for(int j = i + 1; j <= n; j++) {
if(abs(x[i] - x[j]) + abs(y[i] - y[j]) <= 2 * t)
fa[find(i)] = find(j);
}
int cnt = 0;
for(int i = 1; i <= n; i++) if(fa[i] == i) cnt++;
return cnt == 1;
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d%d", &x[i], &y[i]);
int l = 0, r = 1e9, t;
while(l < r) {
t = (l + r) / 2;
if(check(t)) r = t;
else l = t + 1;
}
printf("%d\n", l);
return 0;
}

浙公网安备 33010602011771号