2-SAT问题。
详见:http://blog.youkuaiyun.com/qhpeklh5959/article/details/8991949
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
int dfn[4040],low[4040],f[4040],ceng[4040];
vector<int> q[4040];
stack<int> z;
int n,ntime,nceng;
int t[2020][2];
void add(int a,int i,int b,int j)
{
q[2*a+i].push_back(2*b+j^1);
q[2*b+j].push_back(2*a+i^1);
}
void tarjan(int u)
{
int i,v;
dfn[u]=low[u]=ntime++;
z.push(u);
f[u]=1;
for(i=0;i<q[u].size();i++){
v=q[u][i];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(f[v]==1)
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
while(1){
v=z.top();
z.pop();
f[v]=0;
ceng[v]=nceng;
if(v==u){
nceng++;
break;
}
}
}
bool check(int p)
{
for(int i=0;i<2*n;i++){
dfn[i]=0,low[i]=0,f[i]=0;
q[i].clear();
ntime=1,nceng=1;
ceng[i]=0;
}
while(!z.empty())
z.pop();
for(int i=0;i<n;i++)
for(int j=0;j<2;j++)
for(int k=i+1;k<n;k++)
for(int l=0;l<2;l++)
if(abs(t[i][j]-t[k][l])<p)
add(i,j,k,l);
for(int i=0;i<n*2;i++)
if(!dfn[i])
tarjan(i);
for(int i=0;i<2*n;i+=2)
if(ceng[i]==ceng[i+1])
return 0;
return 1;
}
void init()
{
int i;
for(i=0;i<2*n;i++){
dfn[i]=0,low[i]=0,f[i]=0;
q[i].clear();
ntime=1,nceng=1;
ceng[i]=0;
}
memset(t,0,sizeof(t));
while(!z.empty())
z.pop();
}
int main()
{
int i,j,k;
while(scanf("%d",&n)!=EOF){
init();
int mx=0;
for(i=0;i<n;i++)
for(j=0;j<2;j++){
scanf("%d",&t[i][j]);
mx=max(mx,t[i][j]);
}
int r=mx,l=0;
while(l<r){
int mid=l+(r-l+1)/2;
if(check(mid)) l=mid;
else r=mid-1;
}
printf("%d\n",l);
}
}