poj2749 2-SAT
来源:互联网 发布:北京软件技术学院 编辑:程序博客网 时间:2024/06/06 01:23
别的不说,只说建图。看代码
第一个,第二个代表两个中转站。设第一个为YES,第二个为NO;
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>#include<stack>#include<queue>#include<vector>#include<set>#include<map>#include<string>#define nl n<<1#define nr (n<<1)|1#define fi first#define se secondusing namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int,int>P;const int INF=0x3f3f3f3f;const ll INFF=0x3f3f3f3f3f3f3f3f;const double pi=acos(-1.0);const double eps=1e-9;const ll mod=1e9+7;int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0' | ch>'9') {if(ch=='-') f=-1;ch=getchar();} while(ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();} return x*f;}void Out(int aa){ if(aa>9) Out(aa/10); putchar(aa%10+'0');}int head[1010],cnt;struct node{int a,b,c,next;}edge[510010];void add(int a,int b){ edge[cnt].b=b; edge[cnt].next=head[a]; head[a]=cnt++;}int pre[1010],lowlink[1010],sccno[1010],dfs_cnt,scc_cnt;stack<int>s;int n,a,b,hate[1030][2],frie[1050][2];int x[505],y[505],xx,yy,x2,y2;int dis[510][2],D;void dfs(int u){ pre[u]=lowlink[u]=++dfs_cnt; s.push(u); for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].b; if(!pre[v]) { dfs(v); lowlink[u]=min(lowlink[u],lowlink[v]); } else if(!sccno[v]) { lowlink[u]=min(lowlink[u],pre[v]); } } if(lowlink[u]==pre[u]) { scc_cnt++; while(1) { int x=s.top();s.pop(); sccno[x]=scc_cnt; if(x==u)break; } }}void solve(int n){for(int i=1;i<=n;i++)if(!pre[i])dfs(i);}bool check(int mid){ memset(head,-1,sizeof(head));cnt=0; dfs_cnt=scc_cnt=0; while(!s.empty())s.pop(); memset(pre,0,sizeof(pre)); memset(lowlink,0,sizeof(lowlink)); memset(sccno,0,sizeof(sccno)); for(int i=1;i<=a;i++)//不能同时选(x^y==1) { add(hate[i][0]+n,hate[i][1]); add(hate[i][1]+n,hate[i][0]); add(hate[i][0],hate[i][1]+n); add(hate[i][1],hate[i][0]+n); } for(int i=1;i<=b;i++)//必须同时选(x^y==0) { add(frie[i][0],frie[i][1]); add(frie[i][1],frie[i][0]); add(frie[i][0]+n,frie[i][1]+n); add(frie[i][1]+n,frie[i][0]+n); } for(int i=1;i<n;i++) { for(int j=i+1;j<=n;j++) { if(dis[i][0]+dis[j][0]>mid)//不能都选第一个 { add(i,j+n); add(j,i+n); } if(dis[i][1]+dis[j][1]>mid)//不能都选第二个 { add(i+n,j); add(j+n,i); } if(dis[i][0]+dis[j][1]+D>mid)//不能同时选两个(是,否) { add(i,j); add(j+n,i+n); } if(dis[i][1]+dis[j][0]+D>mid)//不能同时选两个(否,是) { add(i+n,j+n); add(j,i); } } } solve(n*2); for(int i=1;i<=n;i++) { if(sccno[i]==sccno[i+n]) return false; } return true;}int gao(){ int ans=-1,l=0,r=INF; while(r>=l) { int mid=(l+r)/2; if(check(mid))ans=mid,r=mid-1; else l=mid+1; } return ans;}int main(){ n=read(),a=read(),b=read(); xx=read(),yy=read(),x2=read(),y2=read(); D=abs(xx-x2)+abs(yy-y2); for(int i=1;i<=n;i++)x[i]=read(),y[i]=read(); for(int i=1;i<=a;i++)hate[i][0]=read(),hate[i][1]=read(); for(int i=1;i<=b;i++)frie[i][0]=read(),frie[i][1]=read(); for(int i=1;i<=n;i++) { dis[i][0]=abs(x[i]-xx)+abs(y[i]-yy); dis[i][1]=abs(x[i]-x2)+abs(y[i]-y2); } printf("%d\n",gao()); return 0;}
阅读全文
0 0
- poj2749 2-SAT判定
- POJ2749-二分,2SAT
- poj2749 2-SAT
- poj2749 Building roads 2-sat
- POJ2749 Building roads【2-SAT】
- poj2749:Building roads(2-SAT)
- 2-SAT——6.0(poj2749 Building roads)
- 【二分+2-SAT验证】POJ2749[Building roads]题解
- 2-sat
- 【2-SAT】
- 2-SAT
- 2 - sat
- 2-SAT
- 2-SAT
- 2-Sat
- 2-SAT
- 2-sat
- 2-sat
- oracle安装后使用SQLPLUS命令创建表空间和修改用户默认表空间windows平台
- 认识AngularJS
- PHP环境搭建之PHPstorm9+PHP5开发环境配置
- OracleASM参数介绍
- 三种方法的优先级
- poj2749 2-SAT
- activeMQ
- 通过射线检测 获取到某个点的颜色值
- 要写的博客
- Jquery中.attr()和.data()的区别
- 多线程编程(二)
- matlab路径(string)操作及基本data读取保存
- Caravan Robbers UVA
- 新手之路--spark