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;
}