奥赛一本通 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;
}
posted @ 2026-09-08 10:44  萧西待水  阅读(2)  评论(0)    收藏  举报