hdu3715 2-sat+二分
Go Deeper
题意:确定一个0/1数组(size:n)使得满足最多的条件数。条件在数组a,b,c给出。
吐槽:哎,一水提,还搞了很久!关键是抽象出题目模型(如上的一句话)。以后做二sat:有哪些是点,哪些是条件,分清!,然后注意细节。这次居然因为里面一个小错误:
判断有无解的时候,i与i+1是否在一个SCC中的时候,i居然没有每次+2!而是++!傻X了。。。囧!还一直以为自己二分写错。。。
#include<iostream>
#include<cstdio>
#include<stack>
#include<vector>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxv=402;//maxe=500000;
int dfn[maxv];int low[maxv];int vis[maxv];int scc[maxv];int ins[maxv];stack<int>sta;
int times=0; int numb=0;
vector<vector<int> >e(maxv);
void tarjan(int u)
{
dfn[u]=low[u]=times++;
ins[u]=1;
sta.push(u);
for(int i=0;i<e[u].size();i++)
{
int v=e[u][i];
if(!vis[v])
{
vis[v]=1;
tarjan(v);
if(low[v]<low[u])low[u]=low[v];
}
else if(ins[v]&&dfn[v]<low[u])
low[u]=dfn[v];
}
if(low[u]==dfn[u])
{
numb++;
int cur;
do{
cur=sta.top();
sta.pop();
ins[cur]=0;
scc[cur]=numb;
}while(cur!=u);
}
}
int n,m;int a[10005],b[10005],c[10005];
void init()
{
numb=times=0;
for(int i=0;i<maxv;i++)
{
scc[i]=ins[i]=dfn[i]=low[i]=vis[i]=0;
e[i].clear();
}
}
bool build_solve(int x)
{
init();
for(int i=0;i<=x;i++)
{
if(c[i]==2)
{
e[2*a[i]+1].push_back(2*b[i]);
e[2*b[i]+1].push_back(2*a[i]);
}
else if(c[i]==1)
{
e[2*a[i]].push_back(2*b[i]);
e[2*b[i]].push_back(2*a[i]);
e[2*a[i]+1].push_back(2*b[i]+1);
e[2*b[i]+1].push_back(2*a[i]+1);
}
else if(c[i]==0)
{
e[2*a[i]].push_back(2*b[i]+1);
e[2*b[i]].push_back(2*a[i]+1);
}
}
for(int i=0;i<=2*n-1;i++)
{
if(!vis[i])
{
vis[i]=1;
tarjan(i);
}
}
for(int i=0;i<=2*n-2;i+=2) //开始写成i++!!!!WA到跪!
if(scc[i]==scc[i+1])
return 0;
return 1;
}
void readin()
{
for(int i=0;i<m;i++)
scanf("%d%d%d",&a[i],&b[i],&c[i]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
readin();
int l=0,r=m,mid;
while(l+1<r)
{
mid=(l+r)/2;
if(build_solve(mid))
l=mid;
else
r=mid;
}
printf("%d\n",l+1);
}
return 0;
}
hdu3715 2-sat+二分的更多相关文章
- 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 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- hdu3715 二分+2sat+建图
题意: 给你一个递归公式,每多一层就多一个限制,问你最多能递归多少层. 思路: 先分析每一层的限制 x[a[i]] + x[b[i]] != c[i],这里面x[] = 0,1, ...
- hdu3715
hdu3715 题意 给出一个递归的伪代码,当 x[a[dep]] + x[b[dep]] != c[dep],就向下递归,给出a,b,c数组的值 问 dep 最大多少.其中 0 <= c[i] ...
- 证明与计算(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 ...
- LA 3211 飞机调度(2—SAT)
https://vjudge.net/problem/UVALive-3211 题意: 有n架飞机需要着陆,每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种,第i架飞机的早着陆时间 ...
- UVALive - 3211 (2-SAT + 二分)
layout: post title: 训练指南 UVALive - 3211 (2-SAT + 二分) author: "luowentaoaa" catalog: true m ...
- POJ 2749 2SAT判定+二分
题意:图上n个点,使每个点都与俩个中转点的其中一个相连(二选一,典型2-sat),并使任意两点最大 距离最小(最大最小,2分答案),有些点相互hata,不能选同一个中转点,有些点相互LOVE,必需选相 ...
随机推荐
- Centos7(Linux)下安装VMware12
https://blog.csdn.net/u012605477/article/details/65627234
- The Tower of Babylon UVA - 437 DAG上的动态规划
题目:题目链接 思路:每个方块可以用任意多次,但因为底面限制,每个方块每个放置方式选一个就够了,以x y为底 z 为高,以x z为底 y 为高,以y z为底 x为高,因为数据量很小,完全可以把每一种当 ...
- 水题:HDU1034-Candy Sharing Game
解题心得: 1.我是用的模拟的算法直接模拟的每一轮的分配方法的得出的答案,看到有些大神使用的链表做的,好像链表才是这道题的镇长的做法吧. 题目: Candy Sharing Game Time Lim ...
- nova boot添加volume_type参数支持
早前由于添加了全SSD的高性能Ceph集群,区别于现有的HDD集群,在OpenStack端需要能够选择使用两种集群.Cinder配置多Ceph后端的文档早已整理,整理文件夹时发现这篇为nova boo ...
- MySQL之架构与历史(一)
MySQL架构与历史 和其他数据库系统相比,MySQL有点与众不同,它的架构可以在多种不同的场景中应用并发挥好的作用,但同时也会带来一点选择上的困难.MySQL并不完美,却足够灵活,它的灵活性体现在很 ...
- Java web学习总结
javaweb学习总结(十四)——JSP原理 孤傲苍狼 2014-07-24 09:38 阅读:46603 评论:37 JavaWeb学习总结(十三)——使用Session防止表单重复提交 孤 ...
- Careercup - Microsoft面试题 - 5799446021406720
2014-05-12 07:17 题目链接 原题: Given below is a tree/trie A B c D e F a<b<e<>>c<>d&l ...
- 转载: CRichEditCtrl使用大全
richedit 常见使用问题 一.常见问题 a.可以编译,不能执行的 在需要在相应的对话框中加上InitInstance(void)函数中添加 AfxInitRichEdit(); b.升级默认的R ...
- Windows下Eclipse安装PyDev
事后证明PyDev不好用,推荐使用pycharm!!! 1.安装eclipse,这个网上一大堆,就不说了 2.安装python,这个网上一大堆,就不说了 3.Eclipse安装PyDev 第一种在 ...
- python小脚本(18-11.10)-修改excle后批量生成,作用:导入数据时,系统做了不能导入重复数据时的限制时使用 -本来是小白,大神勿扰
from testcase.test_mokuai.operation_excle import OperationExcleimport shutil class test_daoru(): #一个 ...