题目请戳这里

题目大意:

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 + 二分)的更多相关文章

  1. Go Deeper HDU - 3715(2 - sat 水题 妈的 智障)

    Go Deeper Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  2. LA 5010 Go Deeper 2-SAT 二分

    题意: 有\(n\)个布尔变量\(x_i\),有一个递归函数.如果满足条件\(x[a[dep]] + x[b[dep]] \neq c[dep]\),那么就再往深递归一层. 问最多能递归多少层. 分析 ...

  3. 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])$的限制,问从开头开始最多到哪条限制全是有解的. 那么,首先有可二分性,所以 ...

  4. hdu3715 2-sat+二分

    Go Deeper 题意:确定一个0/1数组(size:n)使得满足最多的条件数.条件在数组a,b,c给出. 吐槽:哎,一水提,还搞了很久!关键是抽象出题目模型(如上的一句话).以后做二sat:有哪些 ...

  5. Go Deeper(2010成都现场赛题)(2-sat)

    G - Go Deeper Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description ...

  6. HDU 3715 Go Deeper(2-sat)

    HDU 3715 Go Deeper 题目链接 题意:依据题意那个函数,构造x数组.问最大能递归层数 思路:转化为2-sat问题,因为x仅仅能是0.1,c仅仅能是0,1.2那么问题就好办了,对于0, ...

  7. Go Deeper

    Go Deeper Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  8. 证明与计算(3): 二分决策图(Binary Decision Diagram, BDD)

    0x01 布尔代数(Boolean algebra) 大名鼎鼎鼎的stephen wolfram在2015年的时候写了一篇介绍George Boole的文章:George Boole: A 200-Y ...

  9. Map Labeler POJ - 2296(2 - sat 具体关系建边)

    题意: 给出n个点  让求这n个点所能建成的正方形的最大边长,要求不覆盖,且这n个点在正方形上或下边的中点位置 解析: 当然是二分,但建图就有点还行..比较难想..行吧...我太垃圾... 2 - s ...

随机推荐

  1. boost 相等与等价的区别

  2. python安装MySQLdb(Windows环境)

    1.下载 http://www.codegood.com/downloads 我的win7 64位.Python2.7.8版本,所以选择MySQL-python-1.2.3.win-amd64-py2 ...

  3. eclipse导入或新建项目时报错 v7 v4

    最简单的解决方案 最简单的解决方案 1.下载最新的v4,v7的jar包 http://download.csdn.net/download/u013161218/80772472.放到workspac ...

  4. C#第一节课

    1,命名规范 A.如果声明一个变量,小写,如果有多个单词,后面首字母大写 如: string sString="aa"; int iNum=20; bool bMale=false ...

  5. Examples_08_04

  6. WebBrowser控件使用相关

    修改WebBrowser控件的内核解决方案 http://www.cnblogs.com/sung/p/3391264.html C#中的WebBrowser控件的使用 http://www.cnbl ...

  7. gis基本概念之"投影变换"-浅谈

    目录 1,概述 2,常用的投影方法有 正解变换 反解变换 数值变换 3,定义投影 4,投影变换 1,栅格(投影变换) 2,要素(投影变换) 注意 1,概述 因为GIS描述的是位于地球表面的信息,所以根 ...

  8. python zip文件密码爆破

    #!/usr/bin/env # coding=UTF-8 import zipfile import threading import os import sys class CrackZip: d ...

  9. 你好,C++(23) 4.4.2 工资程序成长记:用数组处理批量数据,用循环结构执行重复动作

    4.4  从语句到程序 了解了各种表达式和语句之后,就相当于掌握了写作文要用到的词语和句子,但是,仅有词语和句子是无法构成一篇有意义的文章的.要完成一篇文章,先需要确定这篇文章的结构,是先分述再总述, ...

  10. 逆天的IE7中,绝对定位元素之间的遮盖问题

    个人比较支持IE9以上的版本,认为他们的样式和效果都是比较人性化的,不过很多时候还是不得不考虑其他版本浏览器的感受,这里IE6就不用考虑他了,这货简直就是IT史上的奇葩,这里要说一个IE7的绝对定位和 ...