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
- POJ 2749 Building Roads
- poj 2749 Building roads
- poj 2749 building roads
- poj 2749 Building roads
- poj 2749 Building roads
- POJ-2749-Building roads
- poj-2749 Building roads
- poj 2749 Building roads #二分+2-sat
- POJ 2749 Building roads (2-sat)
- POJ 2749 Building roads(2-SAT)
- poj 2749 Building roads 2-sat
- POJ 2749 - Building roads(2-SAT+二分)
- poj 2749 Building roads 2-SAT
- POJ 2749 Building roads 已翻译
- |poj 2749|2-SAT|二分|Building roads
- POJ 2749 Building roads (2-SAT)
- POJ 3625 Building Roads
- poj 3625 Building Roads
- HDU--1231 : 最大连续子序列 (DP求连续子序列最大和)
- 面对就业我们是否还在徘徊那么你就看看这篇文章吧
- Java基础视频教程-银行业务调度系统
- linux下vim的配置
- 努力学英语——从背单词开始
- POJ-2749-Building roads
- IOS开发之文件上传
- HDU-4451
- c语言--直接插入算法
- SGU 185 Two shortest 网络流+spfa+省内存
- 对象复制copy与mutableCopy方法的区别
- 新手从零开始学Qt编程(2)
- URAL 1802. Cube Puzzle
- 一个很有价值的研究成果