2-Sat继续~
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<vector> #include<cmath> #include<stack> using namespace std; const int inf=1<<29; const int maxn=1010; const int maxm=maxn*maxn; int e,head[maxn],pnt[maxm],nxt[maxm],dfn[maxn],low[maxn],dfs_clock,sccno[maxn],scc_no; int n,a,b,x[maxn],y[maxn],dist[maxn][2]; vector<pair<int,int> > hate,like; stack<int> s; void AddEdge(int u,int v) { pnt[e]=v;nxt[e]=head[u];head[u]=e++; } int Dis(int i,int j) { return abs(x[i]-x[j])+abs(y[i]-y[j]); } void Build(int dis) { e=0; memset(head,-1,sizeof(head)); for(int i=1;i<=n;i++) { dist[i][0]=Dis(i,n+1); dist[i][1]=Dis(i,n+2); } int s=Dis(n+1,n+2); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { if(dist[i][0]+dist[j][0]>dis) { AddEdge(i,j+n); AddEdge(j,i+n); } if(dist[i][1]+dist[j][1]>dis) { AddEdge(i+n,j); AddEdge(j+n,i); } if(dist[i][0]+s+dist[j][1]>dis) { AddEdge(i,j); AddEdge(j+n,i+n); } if(dist[i][1]+s+dist[j][0]>dis) { AddEdge(i+n,j+n); AddEdge(j,i); } } for(int i=0;i<a;i++) { AddEdge(hate[i].first,hate[i].second+n); AddEdge(hate[i].second,hate[i].first+n); AddEdge(hate[i].first+n,hate[i].second); AddEdge(hate[i].second+n,hate[i].first); } for(int i=0;i<b;i++) { AddEdge(like[i].first,like[i].second); AddEdge(like[i].second+n,like[i].first+n); AddEdge(like[i].second,like[i].first); AddEdge(like[i].first+n,like[i].second+n); } } int Tarjan(int u) { dfn[u]=low[u]=++dfs_clock; s.push(u); for(int i=head[u];i!=-1;i=nxt[i]) { if(!dfn[pnt[i]]) low[u]=min(low[u],Tarjan(pnt[i])); else if(!sccno[pnt[i]]) low[u]=min(low[u],dfn[pnt[i]]); } if(low[u]==dfn[u]) { scc_no++; for(;;) { int x=s.top(); s.pop(); sccno[x]=scc_no; if(x==u) break; } } return low[u]; } bool check(int mid) { Build(mid); memset(dfn,0,sizeof(dfn)); memset(sccno,0,sizeof(sccno)); dfs_clock=scc_no=0; for(int i=1;i<=2*n;i++) if(!dfn[i]) Tarjan(i); for(int i=1;i<=n;i++) if(sccno[i]==sccno[i+n]) return false; return true; } void solve() { int l=0,r=4000100,ans=-1; while(l<=r) { int mid=(l+r)>>1; if(check(mid)) { r=mid-1; ans=mid; } else l=mid+1; } printf("%d\n",ans); } int main() { while(scanf("%d%d%d",&n,&a,&b)!=EOF) { hate.clear(); like.clear(); scanf("%d%d%d%d",&x[n+1],&y[n+1],&x[n+2],&y[n+2]); for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); for(int i=0;i<a;i++) { int sx,sy; scanf("%d%d",&sx,&sy); hate.push_back(make_pair(sx,sy)); } for(int i=0;i<b;i++) { int sx,sy; scanf("%d%d",&sx,&sy); like.push_back(make_pair(sx,sy)); } solve(); } return 0; }