poj 2296

来源:互联网 发布:手机高清网络电视 编辑:程序博客网 时间:2024/06/06 02:14

第一道2-SAT,做的挺纠结的主要是添加边的时候不细心,导致各种错误,检查了n遍终于A了。

2-SAT问题就是一组布尔变量x,分别代表两种对立的选择。还有一组变量之间的或关系的约束条件。看能否给这些变量赋值,使最后赋值的结果能够满足约束条件。

用2-SAT解决关键问题,就是确定变量及其取值所代表的的含义,还有约束条件或关系的确立。我总结了一种方法来确定或关系,就是先写出不满足题目约束条件的与关系,然后再取或关系得到需满足的或关系。比如xi和xj不能同时取1,也就是最后xi和xj的赋值不能够使(xi与xj)==1,也就是必须是(xi与xj)‘=(xi'或xj')==1,从而确定了xi'或xj'==1这一关系,就是xi取0或xj取0这一约束关系。

对于本题,每个点用一个变量来表示,取1表示向上确定正方形,0表示向下确定正方形。二分答案。对于当前的mid值,确定约束条件。如果两个点之间x坐标之差的绝对值大于等于mid的话,就不要考虑关于这两个点的约束条件,因为不管这么取,他俩互不影响,肯定不会相交,对于小于mid的,根据y坐标情况确定约束条件,总共有3种情况,具体代码。

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#include <cmath>#include <stack>#include <vector>#define LL long long#define myabs(x) ((x)>0?(x):(-(x)))using namespace std;const int inf=0x3f3f3f3f;const int maxm=100+10;const int maxn=100*2+10;struct Edge {int v,next;};struct node{int x,y;};node p[maxm];Edge e[maxn*maxn];int mark[maxn];int head[maxn],S[maxn];int n,tot,top;bool cmp(node a,node b){if(a.y==b.y) return a.x<b.x;else return a.y<b.y;}void addedge(int u,int v){e[tot].v=v; e[tot].next=head[u];head[u]=tot++;}int dfs(int u){if(mark[u]) return 1;if(mark[u^1]) return 0;mark[u]=1;int v,i;S[top++]=u;for(i=head[u];i!=-1;i=e[i].next){v=e[i].v;if(!dfs(v)) return 0;}return 1;}int solve(){int low=0,high=40000,mid;int i,j;while(low<=high){mid=(low+high)/2;tot=0;memset(head,-1,sizeof(head));memset(mark,0,sizeof(mark));   //新的2-SAT,注意初始化 int flag=1;for(i=0;i<n;i++){for(j=i+1;j<n;j++){if(myabs(p[i].x-p[j].x)<mid){if((p[j].y-p[i].y)<2*mid&&(p[j].y-p[i].y)>=mid){addedge(j*2,i*2);addedge(i*2+1,j*2+1);}else if((p[j].y-p[i].y)<mid&&(p[j].y-p[i].y)>0){addedge(j*2,i*2);addedge(i*2+1,j*2+1);addedge(j*2,i*2+1);addedge(i*2,j*2+1);addedge(j*2+1,i*2);addedge(i*2+1,j*2);}else if((p[j].y-p[i].y)==0){addedge(j*2+1,i*2);addedge(i*2+1,j*2);addedge(j*2,i*2+1);addedge(i*2,j*2+1);}}}}for(i=0;i<n;i++){if(!mark[i*2]&&!mark[i*2+1]){top=0;if(!dfs(i*2)){while(top>0) mark[S[--top]]=0;if(!dfs(i*2+1)){flag=0;break;}}}}if(flag) low=mid+1;else high=mid-1;}return low-1;}int main(){int T;cin>>T;while(T--){scanf("%d",&n);int i;for(i=0;i<n;i++)scanf("%d%d",&p[i].x,&p[i].y);sort(p,p+n,cmp);int ans=solve();printf("%d\n",ans);}return 0;}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 邻居家小孩把我家东西弄坏了怎么办 邻居早上6点放音乐扰民怎么办 隔壁楼邻居天天放音乐很吵怎么办 发现老公在卧室安了摄像头怎么办 憋的尿又没有厕所的时候怎么办 一岁宝宝拉屎总是拉出血怎么办 孩子鼻窦炎鼻子堵有白色鼻涕怎么办 家里阳台上老是有蝙蝠趴着怎么办 空调太冷在空调房里该怎么办 分手了怎么办不要挽回要重新吸引 过敏体质没打疫苗的孩子入学怎么办 遇到不认识的小姐姐问我问题怎么办 小孩孑脖子洛忱了痛怎么办 挤奶把乳腺挤肿了不出奶怎么办 遇到好兄弟在背后捅刀子怎么办 面对出轨还不想离婚的老公怎么办 法院执行局把案划错了不承认怎么办 手机nfc功能被手机壳挡住怎么办 飞信短信登录验证码达到上限怎么办 手机自带短信软件没了怎么办 老婆出轨孩子又3个不知道怎么办 骑电动车摔跤小脚趾疼有点肿怎么办 第一次太疼了有心理阴影了怎么办 天梭机械表调了时间忽然慢怎么办 支付宝信用住到酒店没房间怎么办 拳头打在硬上骨头肿了怎么办 领导决策出现了失误你该怎么办 我的直销团队走到瓶颈了怎么办 孕妇8个月便秘大便带血怎么办 爱他美金装冲泡有泡沫怎么办 做雅思听力时理解不了原文怎么办 英国读语言班不想读研了怎么办 英国读研本科学位不够分怎么办 英国华威大学读研没分到宿舍怎么办 英国留学申请大学成绩没通过怎么办 很想上专升本但是专科挂科怎么办 英国学校申请的gpa太低了怎么办 博士面试通过后导师不签名怎么办 资助出国留学协议书写错了怎么办 人生最低谷运气最差的时候怎么办 孩子出国留学一年后想回国怎么办