题目分析:
- 二分时间
t
t
t
- 用并查集维护连通性,求出两点的曼哈顿距离如果
<
=
2
∗
t
<=2*t
<=2∗t,因为两点都在扩散
Code:
#include <bits/stdc++.h>
using namespace std;
#define maxn 60
int n,x[maxn],y[maxn],f[maxn];
inline int read_() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return x*f;
}
inline int dis_(int i,int j) {
return abs(x[i]-x[j])+abs(y[i]-y[j]);
}
int find_(int x) {
if(f[x]==x) return x;
return f[x]=find_(f[x]);
}
inline bool check_(int t) {
for(int i=1;i<=n;++i) f[i]=i;
for(int i=1;i<=n;++i) {
for(int j=i+1;j<=n;++j) {
int fx=find_(i),fy=find_(j);
if(fx==fy) continue;
int pdc=dis_(i,j);
if(pdc<=2*t) f[fx]=fy;
}
}
int cnt=0;
for(int i=1;i<=n;++i) {
if(f[i]==i) ++cnt;
if(cnt>1) return false;
}
return true;
}
void readda_() {
n=read_();
for(int i=1;i<=n;++i) {
x[i]=read_();y[i]=read_();
}
int l=0,ans,r=1000000000,mid;
while(l<=r) {
mid=(l+r)>>1;
if(check_(mid)) {
ans=mid;
r=mid-1;
}
else l=mid+1;
}
printf("%d",ans);
}
int main() {
freopen("a.txt","r",stdin);
readda_();
return 0;
}