UVA 1146 Now or later(2-SAT)

来源:互联网 发布:gnuradio python模块 编辑:程序博客网 时间:2024/05/16 03:30
#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;}

0 0