2-sat问题,一种在两种可能性中选择必然关系的问题。

推荐两篇论文,也是学2-sat公认比较好的材料。前者较好理解,后者需耐心看。

http://www.google.com.hk/url?sa=t&rct=j&q=2-sat&source=web&cd=6&ved=0CEUQFjAF&url=http%3a%2f%2fbbs%2ebyr%2ecn%2fwForum%2fboardcon%2ephp%3fbid%3d212%26id%3d15887%26ftype%3d3%26ap%3d369&ei=30wAUsrlDYLHkwXam4GoBA&usg=AFQjCNHn7CqQ5EIiXNyfUmYM7jYYsIMfeQ&bvm=bv.50165853,d.dGI&cad=rjt

http://bbs.byr.cn/wForum/boardcon.php?bid=212&id=15890&ftype=3&ap=278

“最小值尽量大”问题,又是一种经典模型,二分答案,从而判断是否能构建出合适的方案。

代码看书码的,注意几点:

不能缩点,会把不成立的情况缩掉,所以改为标记。

一旦任意一点的两种可能性都不成立,即不存在完整的方案。

本题只是二选一,A或B的一种形式来建边的,其他形式的2-sat要通过做题去接触,不过,总的来说都是根据必然关系建图。

 #include<stdio.h>
#include<string.h>
#include<vector>
#include<stdlib.h>
#include<algorithm>
using namespace std; const int MAXN=; int T[MAXN][],n;
bool mark[MAXN<<];
int S[MAXN<<],c;
vector<int >G[MAXN<<]; void init(int n)
{
for(int i=;i<(n<<);i++)
G[i].clear();
memset(mark,,sizeof(mark));
} void add(int x,int xval,int y,int yval)
{
x=(x<<)+xval;
y=(y<<)+yval;
G[x].push_back(y^);
G[y].push_back(x^);
} bool dfs(int x)
{
if(mark[x^])
return false;
if(mark[x])
return true;
S[c++]=x;
mark[x]=true;
for(int i=;i<G[x].size();i++)
if(!dfs(G[x][i]))
return false;
return true;
} bool solve()
{
for(int i=;i<(n<<);i+=)
{
if(!mark[i]&&!mark[i+]){
c=;
if(!dfs(i)){
while(c>)
mark[S[--c]]=false;
if(!dfs(i+))
return false;
}
}
}
return true;
} int test(int p)
{
init(n);
for(int i=;i<n;i++)
for(int a=;a<;a++)
for(int j=i+;j<n;j++)
for(int b=;b<;b++)
if(abs(T[i][a]-T[j][b])<p)
add(i,a,j,b);
return solve();
} int main()
{
while(~scanf("%d",&n))
{
int l,r;
l=r=;
for(int i=;i<n;i++)
{
for(int j=;j<;j++)
{
scanf("%d",&T[i][j]);
r=max(r,T[i][j]);
}
}
while(l<r)
{
int m=l+(r-l+)/;
if(test(m))
l=m;
else
r=m-;
}
printf("%d\n",l);
}
return ;
}

UVALive 3211 Now or later(2-sat)的更多相关文章

  1. UVALive - 3211 - Now or later(图论——2-SAT)

    Problem   UVALive - 3211 - Now or later Time Limit: 9000 mSec Problem Description Input Output Sampl ...

  2. UVALive 7146 Defeat the Enemy(贪心+STL)(2014 Asia Shanghai Regional Contest)

    Long long ago there is a strong tribe living on the earth. They always have wars and eonquer others. ...

  3. LA 3211 飞机调度(2—SAT)

    https://vjudge.net/problem/UVALive-3211 题意: 有n架飞机需要着陆,每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种,第i架飞机的早着陆时间 ...

  4. UVALive 3211 Now or Later (2-SAT)

    题目的要求一个最小值最大,二分即可,但是怎么判断呢? 飞机早或者晚两种状态,可以用一个布尔变量表示,假设当前猜测为m,那么根据题意, 如果x和y所对应的时间冲突那么就是¬(xΛy)化成或的形式(¬x) ...

  5. POJ 3678 Katu Puzzle(2 - SAT) - from lanshui_Yang

    Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...

  6. 学习笔记(two sat)

    关于two sat算法 两篇很好的论文由对称性解2-SAT问题(伍昱), 赵爽 2-sat解法浅析(pdf). 一些题目的题解 poj 3207 poj 3678 poj 3683 poj 3648 ...

  7. UVALive 6609 Minimal Subarray Length(RMQ-ST+二分)

    题意:给定长度为N的数组,求一段连续的元素之和大于等于K,并且让这段元素的长度最小,输出最小长度即可,若不存在这样的元素集合,则输出-1 题目链接:UVAlive 6609 做法:做一个前缀和pref ...

  8. UVALive 5903 Piece it together(二分图匹配)

    给你一个n*m的矩阵,每个点为'B'或'W'或'.'.然后你有一种碎片.碎片可以旋转,问可否用这种碎片精确覆盖矩阵.N,M<=500 WB  <==碎片 W 题目一看,感觉是精确覆盖(最近 ...

  9. UVALive 2403 77377解题报告(深搜)

    题意:给你一些固定的字符串,在给出数字,根据键盘的对应关系,输出所有的满足条件的字符串,输出顺序无所谓. 思路:因为题目说了,输出比较小,说明测试数据并不强,所以可以暴力回溯求出答案,将所有的给出的字 ...

随机推荐

  1. C# 该行已经属于另一个表 的解决方法[转]

    该文转自:http://blog.sina.com.cn/s/blog_48e4c3fe0100nzs6.html DataTable dt = new DataTable(); dt = ds.Ta ...

  2. svn: E155004: ..(path of resouce).. is already locked

    svn: E155004: ..(path of resouce).. is already locked I'm getting an error when trying to commit a c ...

  3. release下去除nslog宏

    #ifdef __OPTIMIZE__ #define NSLog(...) #endif 加在pch文件里面

  4. 编写一个函数,接受三个string参数,s,oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。测试你的程序,用他替换通用的简写形式,如,将“tho”,将“”“”

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  5. 单例模式(.NET)

    问题描述:         单例模式 Singleton Pattern 问题解决: (1)单例模式简介: Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个 ...

  6. MongoDB { code: 18, ok: 0.0, errmsg: "auth fails" } 原因

    MongoDB出现 { code: 18, ok: 0.0, errmsg: "auth fails" }  错误的原因: 1.账号密码错误 2.账号不属于该数据库

  7. [转载]Winform开发框架之统计图表的实现

    在前面的一些随笔中,介绍了不少我的Winform框架的特性,上篇随笔<Winform开发框架之通用高级查询模块>对其中的通用高级模块进了一个整理说明,本篇继续介绍Winform开发框架重要 ...

  8. spoj 1108

    要求输出一个牌的顺序 使每隔1.2.......n翻牌后出现1 2 3 4 5 6 7 8 9 .... n 将牌想象成n个空格  正向推 空n个位置放n 循环 需优化 #include <io ...

  9. python对json的相关操作

    什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...

  10. 转一个distinct用法,很有帮助

    转一个distinct用法,很有帮助 (2011-12-01 15:18:11) 转载▼ 标签: 杂谈 分类: mysql复制 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提 ...