水题吧。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=100+5;
struct TwoSAT{
int n;
vector<int> G[maxn*2];
bool mark[maxn*2];
int s[maxn*2],c;
bool dfs(int x){
if(mark[x^1]) return false;
if(mark[x]) return true;
mark[x]=true;
s[c++]=x;
for(int i=0;i<G[x].size();i++)
if(!dfs(G[x][i])) return false;
return true;
}
void init(int n){
this->n=n;
for(int i=0;i<2*n;i++) G[i].clear();
memset(mark,0,sizeof(mark));
}
void add_clause(int x,int xval,int y,int yval){
x=x*2+xval;
y=y*2+yval;
G[x^1].push_back(y);
G[y^1].push_back(x);
}
bool solve(){
for(int i=0;i<2*n;i+=2){
if(!mark[i]&&!mark[i+1]){
c=0;
if(!dfs(i)){
while(c) mark[s[--c]]=false;
if(!dfs(i+1)) return false;
}
}
}
return true;
}
};
TwoSAT solver;
int n;
struct point{int x,y;}points[maxn];
bool test(int diff)
{
solver.init(n);
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
int x1=points[i].x,y1=points[i].y;
int x2=points[j].x,y2=points[j].y;
if(abs(x1-x2)<diff){
if(y1==y2){
solver.add_clause(i,0^1,j,0^1);
solver.add_clause(i,1^1,j,1^1);
}
else if(abs(y1-y2)<diff){
if(y1>y2){
solver.add_clause(i,0^1,j,0^1);
solver.add_clause(i,1^1,j,0^1);
solver.add_clause(i,1^1,j,1^1);
}
else{
solver.add_clause(i,0^1,j,0^1);
solver.add_clause(i,0^1,j,1^1);
solver.add_clause(i,1^1,j,1^1);
}
}
else{
if(abs(y1-y2)<2*diff&&abs(y1-y2)>diff){
if(y1>y2) solver.add_clause(i,1^1,j,0^1);
else solver.add_clause(i,0^1,j,1^1);
}
}
}
}
}
return solver.solve();
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d%d",&points[i].x,&points[i].y);
int l=1,r=40000;
while(l<r){
int mid=l+(r-l+1)/2;
if(test(mid)) l=mid;else r=mid-1;
}
printf("%d\n",l);
}
return 0;
}