POJ-2749-Building roads

来源:互联网 发布:淘宝贷款app 编辑:程序博客网 时间:2024/05/22 02:19

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


0 0
原创粉丝点击