【2-SAT+二分】POJ 2749
来源:互联网 发布:红蜘蛛教学软件窗口化 编辑:程序博客网 时间:2024/05/17 04:28
http://hi.baidu.com/%8E%E1%D0%B3/blog/item/3f5354fa18498c01d9f9fd4a.html
#define N 1111vector<int> v[N];stack<int> s;bool vis[N];bool inStack[N];int low[N],dfn[N];int belong[N];//属于哪个强连通分量int n,m,step,t,A,B;int len;int sx[3],sy[3];int a[1001][2],b[1001][2];int d[N];int dis(int x1,int y1,int x2,int y2){ return abs(x1-x2)+abs(y1-y2);}void init(){ int i; for(i=0;i<=2*n;i++){ v[i].clear(); vis[i] = 0; inStack[i] = 0; } while(!s.empty())s.pop();}void add(int a,int b){ v[a].push_back(b);}//tarjan缩点void tarjan(int u){ vis[u]=true; step++; s.push(u); inStack[u]=true; low[u]=step,dfn[u]=step; int i,j; for(i=0;i<v[u].size();i++) { int x=v[u][i]; if(!vis[x]) { tarjan(x); low[u]=min(low[u],low[x]); } else if(inStack[x]) low[u]=min(low[u],dfn[x]); } if(low[u]==dfn[u]) { t++; while(1) { int x=s.top(); s.pop(); belong[x]=t; inStack[x]=false; if(x==u)break; } }}void build(int mid){ int i,j; init(); int u,v; for(i=1;i<=A;i++){ u = a[i][0]; v = a[i][1]; add(u,v+n); add(v,u+n); add(u+n,v); add(v+n,u); } for(i=1;i<=B;i++){ u = b[i][0]; v = b[i][1]; add(u,v); add(v,u); add(u+n,v+n); add(v+n,u+n); } for(i=1;i<=n;i++){ for(j=i+1;j<=n;j++){ if(d[i]+d[j] > mid){ add(i,j+n); add(j,i+n); } if(d[i+n]+d[j+n] > mid){ add(i+n,j); add(j+n,i); } if(d[i]+d[j+n]+len > mid){ add(i,j); add(j+n,i+n); } if(d[i+n]+d[j]+len > mid){ add(i+n,j+n); add(j,i); } } }}bool sat(int mid){ t = 0,step = 0; build(mid); int i; for(i=1;i<=2*n;i++) if(!vis[i])tarjan(i); for(i=1;i<=n;i++) if(belong[i] == belong[i+n])return false; return true;}int main(){ while(scanf("%d%d%d",&n,&A,&B) != -1){ int i,j; scanf("%d%d%d%d",&sx[1],&sy[1],&sx[2],&sy[2]); len = dis(sx[1],sy[1],sx[2],sy[2]); int l = 0,r = 0,mid; for(i=1;i<=n;i++){ int x,y; scanf("%d%d",&x,&y); d[i] = dis(x,y,sx[1],sy[1]); d[i+n] = dis(x,y,sx[2],sy[2]); r = max(r,max(d[i],d[i+n])); } for(i=1;i<=A;i++){//hate scanf("%d%d",&a[i][0],&a[i][1]); } for(i=1;i<=B;i++){//like scanf("%d%d",&b[i][0],&b[i][1]); } int ans = -1; r *= 3; while(l<=r){ mid = (l+r)>>1; if(sat(mid)){ ans = mid; r = mid-1; } else l = mid+1; } printf("%d\n",ans); } return 0;}
- 【2-SAT+二分】POJ 2749
- POJ 2749 二分+2-sat判定
- poj 2749 Building roads #二分+2-sat
- POJ 2749 2SAT判定+二分
- POJ 2749 - Building roads(2-SAT+二分)
- |poj 2749|2-SAT|二分|Building roads
- poj 2723【2-SAT+二分】
- poj 2296 二分+2-sat
- hdu 1815,poj 2749 (2—SAT+二分)
- poj 2749 Building roads(2-sat+二分)
- poj 2749 Building roads (二分+拆点+2-sat)
- Poj 2749 & Hdu 1815 Building roads (2-SAT + 二分 建图)
- POJ 2749 && HDU 1815 Building roads(2-SAT+二分)
- POJ 2749|Building roads|2-SAT|二分答案
- Poj 2749 Building roads【二分+2-Sat----------Tarjan强连通】
- POJ--2749[Building roads] 2-SAT第五题,2—SAT+二分判定
- POJ 2723 二分+ 2-sat 判定
- poj 2723(2-sat+二分答案)
- ubuntu 下mysql的常用命令
- 这样的工作最好不去
- 经典的23种设计模式
- XEN启动过程分析
- 适配器模式(Adapter Pattern)
- 【2-SAT+二分】POJ 2749
- COMMAND模式--《敏捷软件开发》读书笔记(一)
- 全排列算法
- Java(2012/1/26)
- Java中Map和StringTokenizer的使用
- Java读写文件
- Java——1、2、3、4能组成多少无重复数字的三位数
- getCurrentSession与openSession的区别
- Ps图片去除背景