题目链接:http://poj.org/problem?id=2296
二分+2sat,每个点的上下两个方向为2sat的两个状态。
1 //STATUS:C++_AC_16MS_536KB 2 #include <functional> 3 #include <algorithm> 4 #include <iostream> 5 //#include <ext/rope> 6 #include <fstream> 7 #include <sstream> 8 #include <iomanip> 9 #include <numeric> 10 #include <cstring> 11 #include <cassert> 12 #include <cstdio> 13 #include <string> 14 #include <vector> 15 #include <bitset> 16 #include <queue> 17 #include <stack> 18 #include <cmath> 19 #include <ctime> 20 #include <list> 21 #include <set> 22 #include <map> 23 using namespace std; 24 //using namespace __gnu_cxx; 25 //define 26 #define pii pair<int,int> 27 #define mem(a,b) memset(a,b,sizeof(a)) 28 #define lson l,mid,rt<<1 29 #define rson mid+1,r,rt<<1|1 30 #define PI acos(-1.0) 31 //typedef 32 typedef long long LL; 33 typedef unsigned long long ULL; 34 //const 35 const int N=110; 36 const int INF=0x3f3f3f3f; 37 const int MOD=5000,STA=100010; 38 const LL LNF=1LL<<60; 39 const double EPS=1e-8; 40 const double OO=1e15; 41 const int dx[4]={-1,0,1,0}; 42 const int dy[4]={0,1,0,-1}; 43 const int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 44 //Daily Use ... 45 inline int sign(double x){return (x>EPS)-(x<-EPS);} 46 template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;} 47 template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;} 48 template<class T> inline T lcm(T a,T b,T d){return a/d*b;} 49 template<class T> inline T Min(T a,T b){return a<b?a:b;} 50 template<class T> inline T Max(T a,T b){return a>b?a:b;} 51 template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);} 52 template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);} 53 template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));} 54 template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));} 55 //End 56 57 int nod[N][2]; 58 int first[N*2],next[N*N*4],vis[N*2],S[N*2]; 59 int T,n,mt,cnt; 60 61 struct Edge{ 62 int u,v; 63 }e[N*N*4]; 64 65 void adde(int a,int b) 66 { 67 e[mt].u=a,e[mt].v=b; 68 next[mt]=first[a];first[a]=mt++; 69 } 70 71 int dfs(int u) 72 { 73 if(vis[u^1])return 0; 74 if(vis[u])return 1; 75 int i; 76 vis[u]=1; 77 S[cnt++]=u; 78 for(i=first[u];i!=-1;i=next[i]){ 79 if(!dfs(e[i].v))return 0; 80 } 81 return 1; 82 } 83 84 int Twosat() 85 { 86 int i,j; 87 for(i=0;i<n;i+=2){ 88 if(vis[i] || vis[i^1])continue; 89 cnt=0; 90 if(!dfs(i)){ 91 while(cnt)vis[S[--cnt]]=0; 92 if(!dfs(i^1))return 0; 93 } 94 } 95 return 1; 96 } 97 98 int judge(double *a1,double *a2,double *b1,double *b2) 99 { 100 if(Max(a1[0],a2[0])<=Min(b1[0],b2[0]) 101 || Min(a1[0],a2[0])>=Max(b1[0],b2[0]) 102 || Max(a1[1],a2[1])<=Min(b1[1],b2[1]) 103 || Min(a1[1],a2[1])>=Max(b1[1],b2[1]))return 0; 104 return 1; 105 } 106 107 void init(double limt) 108 { 109 int i,j,x,y; 110 double a1[2],a2[2],b1[2],b2[2]; 111 mt=0;mem(vis,0); 112 mem(first,-1); 113 for(i=0;i<n;i++){ 114 for(j=i+1;j<n;j++){ 115 x=i<<1;y=j<<1; 116 a1[0]=nod[i][0]-limt/2,a1[1]=nod[i][1];b1[0]=nod[j][0]-limt/2,b1[1]=nod[j][1]; 117 a2[0]=nod[i][0]+limt/2,b2[0]=nod[j][0]+limt/2; 118 a2[1]=nod[i][1]-limt;b2[1]=nod[j][1]-limt; 119 if(judge(a1,a2,b1,b2)){ 120 adde(x,y^1);adde(y,x^1); 121 } 122 b2[1]=nod[j][1]+limt; 123 if(judge(a1,a2,b1,b2)){ 124 adde(x,y);adde(y^1,x^1); 125 } 126 a2[1]=nod[i][1]+limt;b2[1]=nod[j][1]-limt; 127 if(judge(a1,a2,b1,b2)){ 128 adde(x^1,y^1);adde(y,x); 129 } 130 b2[1]=nod[j][1]+limt; 131 if(judge(a1,a2,b1,b2)){ 132 adde(x^1,y);adde(y^1,x); 133 } 134 } 135 } 136 } 137 138 int binary(int l,int r) 139 { 140 int mid; 141 while(l<r){ 142 mid=(l+r)>>1; 143 // printf("%d %d\n",l,r); 144 init(mid); 145 if(Twosat())l=mid+1; 146 else r=mid; 147 } 148 return l; 149 } 150 151 int main() 152 { 153 // freopen("in.txt","r",stdin); 154 int i,j; 155 scanf("%d",&T); 156 while(T--) 157 { 158 scanf("%d",&n); 159 for(i=0;i<n;i++){ 160 scanf("%d%d",&nod[i][0],&nod[i][1]); 161 } 162 163 printf("%d\n",binary(0,20001)-1); 164 } 165 return 0; 166 }