zoj3422Go Deeper(2-sat + 二分)
题目大意:
go(int dep, int n, int m)
begin
output the value of dep.
if dep < m and x[a[dep]] + x[b[dep]] != c[dep] then go(dep + 1, n, m)
end
读上面程序段,yy出函数功能。数组a,b,c长度为m,x长度为n。数组a,b中元素范围[0,n - 1],数组c元素为0或1或2。x数组元素为1或0。求能输出的最大的m。
题目分析:2-sat,还是比较裸的吧。要求最大的m,所以对长度m二分。
详情请见代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 405;
const int M = 10005; struct node
{
int to,next;
}g[M];
int head[N],stack1[N],stack2[N],vis[N],scc[N];
int n,m,num;
bool flag;
int a[M],b[M],c[M];
void init()
{
memset(head,-1,sizeof(head));
flag = true;
memset(vis,0,sizeof(vis));
memset(scc,0,sizeof(scc));
stack1[0] = stack2[0] = 0;
num = 0;
}
void build(int s,int e)
{
g[num].to = e;
g[num].next = head[s];
head[s] = num ++;
}
void dfs(int cur,int &sig,int &cnt)
{
if(flag == false)
return;
vis[cur] = ++ sig;
stack1[++stack1[0]] = cur;
stack2[++stack2[0]] = cur;
for(int i = head[cur];~i;i = g[i].next)
{
if(!vis[g[i].to])
dfs(g[i].to,sig,cnt);
else
{
if(scc[g[i].to] == 0)
while(vis[stack2[stack2[0]]] > vis[g[i].to])
stack2[0] --;
}
}
if(stack2[stack2[0]] == cur)
{
stack2[0] --;
cnt ++;
do
{
scc[stack1[stack1[0]]] = cnt;
if(scc[stack1[stack1[0]]^1] == cnt)
{
flag = false;
return;
}
}while(stack1[stack1[0] --] != cur);
}
}
void Gabow()
{
int i,sig,cnt;
sig = cnt = 0;
for(i = 0;i < n + n && flag;i ++)
if(!vis[i])
dfs(i,sig,cnt);
}
void solve()
{
int l,r,mid;
int ans,i;
l = 0;r = m;
while(l <= r)
{
mid = (l + r)>>1;
init();
for(i = 0;i < mid;i ++)
{
int u = a[i]<<1;
int v = b[i]<<1;
if(c[i] == 0)// !=0
{
build(u,v^1);
build(v,u^1);
}
if(c[i] == 1)// != 1
{
build(u,v);
build(v,u);
build(u^1,v^1);
build(v^1,u^1);
}
if(c[i] == 2)// != 2
{
build(u^1,v);
build(v^1,u);
}
}
Gabow();
if(flag)
{
ans = mid;
l = mid + 1;
}
else
r = mid - 1;
}
printf("%d\n",ans);
}
int main()
{
int i,t;
scanf("%d",&t);
while(t --)
{
scanf("%d%d",&n,&m);
for(i = 0;i < m;i ++)
scanf("%d%d%d",&a[i],&b[i],&c[i]);
solve();
}
return 0;
}
zoj3422Go Deeper(2-sat + 二分)的更多相关文章
- Go Deeper HDU - 3715(2 - sat 水题 妈的 智障)
Go Deeper Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- LA 5010 Go Deeper 2-SAT 二分
题意: 有\(n\)个布尔变量\(x_i\),有一个递归函数.如果满足条件\(x[a[dep]] + x[b[dep]] \neq c[dep]\),那么就再往深递归一层. 问最多能递归多少层. 分析 ...
- hdu3715 Go Deeper[二分+2-SAT]/poj2723 Get Luffy Out[二分+2-SAT]
这题转化一下题意就是给一堆形如$a_i + a_j \ne c\quad (a_i\in [0,1],c\in [0,2])$的限制,问从开头开始最多到哪条限制全是有解的. 那么,首先有可二分性,所以 ...
- hdu3715 2-sat+二分
Go Deeper 题意:确定一个0/1数组(size:n)使得满足最多的条件数.条件在数组a,b,c给出. 吐槽:哎,一水提,还搞了很久!关键是抽象出题目模型(如上的一句话).以后做二sat:有哪些 ...
- Go Deeper(2010成都现场赛题)(2-sat)
G - Go Deeper Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description ...
- HDU 3715 Go Deeper(2-sat)
HDU 3715 Go Deeper 题目链接 题意:依据题意那个函数,构造x数组.问最大能递归层数 思路:转化为2-sat问题,因为x仅仅能是0.1,c仅仅能是0,1.2那么问题就好办了,对于0, ...
- Go Deeper
Go Deeper Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Sub ...
- 证明与计算(3): 二分决策图(Binary Decision Diagram, BDD)
0x01 布尔代数(Boolean algebra) 大名鼎鼎鼎的stephen wolfram在2015年的时候写了一篇介绍George Boole的文章:George Boole: A 200-Y ...
- Map Labeler POJ - 2296(2 - sat 具体关系建边)
题意: 给出n个点 让求这n个点所能建成的正方形的最大边长,要求不覆盖,且这n个点在正方形上或下边的中点位置 解析: 当然是二分,但建图就有点还行..比较难想..行吧...我太垃圾... 2 - s ...
随机推荐
- Java基础知识强化91:DateFormat类之DateFormat实现日期和字符串的相互转换
1. DateFormat类概述: DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间. 是抽象类,所以使用其子类SimpleDateFormat 2. ...
- JSP学习笔记(1)
JSP本质就是一个servlet,当第一次接受到客户端请求时会被编译成对应的servlet,且对应的每个servlet在容器中只要一个实例. 1.1.JSP注释 <%-- JSP注释部分 --& ...
- iOS改变图片尺寸
- (UIImage *)originImage:(UIImage *)image scaleToSize:(CGSize)size { UIGraphicsBeginImageContext(siz ...
- 手动安装svn到eclipse
今天为了装个svn搞得我焦头烂额~ 1.下载site-1.10.10.zip.(http://download.csdn.net/download/codepython/9082533) 2.在ecl ...
- oracle查询blob类型
下午要查询一个数据,要求是从 表t_report 中查找出 mainbody字段中包含“hibernate”字符串的所有信息.而mainbody字段是blob类型.百度后终于找到答案: DBMS_LO ...
- pragram once
#pragma once [1]#pragma once这个宏有什么作用? 为了避免同一个文件被include多次,C/C++中有两种宏实现方式:一种是#ifndef方式,一种是#pragma o ...
- jquery获取浏览器高度、宽度和滚动条高度(来自网络)
Jquery代码: alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(document).height()); //浏览器时下窗口文档的高度 ale ...
- 测试RegExp对象的属性
//测试RegExp对象的属性function testRegExpProperty(){ var regexp = /abc/; //regexp.ignoreCase = true; //无效 c ...
- cxf所用的lib
cxf_lib
- Python操作excel(xlrd和xlwt)
Python操作excel表格有很多支持的库,例如:xlrd.xlwt.openpyxl.win32com,下面介绍使用xlrd.xlwt和xlutils模块这三个库不需要其他的支持,在任何操作系统上 ...