白书上照抄。。缩进缩错了,导致一个return一直写错地方。。对着LRJ的代码改了一个上午没改出来。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
const int maxn=2020;
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)
{
int tmp=G[x][i];
if(!dfs(tmp))return false;
}
return true;
}
void init(int nn)
{
this->n=nn;
for(int i=0;i<=n*2;++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>0)mark[S[--c]] = false;
if(!dfs(i+1)) return false;
}
}
}
return true;
}
};
TwoSAT solver;
int T[maxn][2];
int n;
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()
{
// freopen("data.txt","r",stdin);
while(scanf("%d",&n)==1&&n>1)
{
int l=0;
int r=0;
for(int i=0;i<n;++i)
{
scanf("%d%d",&T[i][0],&T[i][1]);
r=max(r,T[i][1]);
r=max(r,T[i][0]);
}
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;
}