刚开始学,具体题解看紫书325页
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <set> using namespace std; #define hh printf("=======================\n"); const int maxn=10000+100; struct Twosat { vector<int> g[maxn*2]; bool mark[maxn*2]; int s[maxn*2]; int n,c; void init(int n) { this->n=n; for(int i=0;i<2*n;i++) g[i].clear(); memset(mark,0,sizeof(mark)); } bool dfs(int u) { if(mark[u]) return true; if(mark[u^1]) return false; mark[u]=1; s[c++]=u; for(int i=0;i<g[u].size();i++) if(!dfs(g[u][i])) return false; return true; } 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 solved() { 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]]=0; if(!dfs(i+1)) return false; } } return true; } }; Twosat tt; int n; int t[maxn][5]; bool test(int x) { tt.init(n); for(int i=0;i<n;i++) for(int a=0;a<2;a++) for(int j=0;j<i;j++) for(int b=0;b<2;b++) if(abs(t[i][a]-t[j][b])<x) tt.add_clause(i,a^1,j,b^1); return tt.solved(); } int main() { while(~scanf("%d",&n)) { int r=0; for(int i=0;i<n;i++) { for(int a=0;a<2;a++) { scanf("%d",&t[i][a]); r=max(r,t[i][a]); } } int l=0; while(l<r) { int mid=l+(r-l+1)/2; if(test(mid)) l=mid; else r=mid-1; } printf("%d\n",l); } return 0; }
时间: 2024-11-13 09:42:37