UVA1146 Now or later

来源:互联网 发布:优酷福利待遇 知乎 编辑:程序博客网 时间:2024/05/17 10:54

2-SAT问题。

详见:http://blog.csdn.net/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);}}


原创粉丝点击