#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=2000+5;
struct TwoSAT{
int n;
vector<int> G[maxn*2];
int 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<n*2;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,T[maxn][2];
bool test(int diff)
{
solver.init(n);
for(int i=0;i<n;i++){
for(int a=0;a<2;a++){
for(int j=i+1;j<n;j++){
for(int b=0;b<2;b++){
if(abs(T[i][a]-T[j][b])<diff) solver.add_clause(i,a^1,j,b^1);
}
}
}
}
return solver.solve();
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int L=0,R=0;
for(int i=0;i<n;i++){
scanf("%d%d",&T[i][0],&T[i][1]);
R=max(R,T[i][1]);
}
while(L<R){
int M=L+(R-L+1)/2;
if(test(M)) L=M;else R=M-1;
}
printf("%d\n",L);
}
return 0;
}
UVA 1146 Now or later(2-SAT)
最新推荐文章于 2020-11-04 23:22:34 发布