HDU3715(二分+2-SAT)
Go Deeper
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 3184 Accepted Submission(s): 1035
Problem Description
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
In this code n is an integer. a, b, c and x are 4 arrays of integers. The index of array always starts from 0. Array a and b consist of non-negative integers smaller than n. Array x consists of only 0 and 1. Array c consists of only 0, 1 and 2. The lengths of array a, b and c are m while the length of array x is n. Given the elements of array a, b, and c, when we call the procedure go(0, n, m) what is the maximal possible value the procedure may output?
Input
Output
Sample Input
2 1
0 1 0
2 1
0 0 0
2 2
0 1 0
1 1 2
Sample Output
1
2
Author
Source
- //2017-08-27
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <iomanip>
- #include <cmath>
- using namespace std;
- const int N = ;
- const int M = N*N;
- const double EPS = 1e-;
- int head[N], rhead[N], tot, rtot;
- struct Edge{
- int to, next;
- }edge[M], redge[M];
- void init(){
- tot = ;
- rtot = ;
- memset(head, -, sizeof(head));
- memset(rhead, -, sizeof(rhead));
- }
- void add_edge(int u, int v){
- edge[tot].to = v;
- edge[tot].next = head[u];
- head[u] = tot++;
- redge[rtot].to = u;
- redge[rtot].next = rhead[v];
- rhead[v] = rtot++;
- }
- vector<int> vs;//后序遍历顺序的顶点列表
- bool vis[N];
- int cmp[N];//所属强连通分量的拓扑序
- //input: u 顶点
- //output: vs 后序遍历顺序的顶点列表
- void dfs(int u){
- vis[u] = true;
- for(int i = head[u]; i != -; i = edge[i].next){
- int v = edge[i].to;
- if(!vis[v])
- dfs(v);
- }
- vs.push_back(u);
- }
- //input: u 顶点编号; k 拓扑序号
- //output: cmp[] 强连通分量拓扑序
- void rdfs(int u, int k){
- vis[u] = true;
- cmp[u] = k;
- for(int i = rhead[u]; i != -; i = redge[i].next){
- int v = redge[i].to;
- if(!vis[v])
- rdfs(v, k);
- }
- }
- //Strongly Connected Component 强连通分量
- //input: n 顶点个数
- //output: k 强连通分量数;
- int scc(int n){
- memset(vis, , sizeof(vis));
- vs.clear();
- for(int u = ; u < n; u++)
- if(!vis[u])
- dfs(u);
- int k = ;
- memset(vis, , sizeof(vis));
- for(int i = vs.size()-; i >= ; i--)
- if(!vis[vs[i]])
- rdfs(vs[i], k++);
- return k;
- }
- int n, m;
- int a[], b[], c[];
- bool check(int len){
- init();
- for(int i = ; i < len; i++){
- if(c[i] == ){
- add_edge(a[i]+n, b[i]);
- add_edge(b[i]+n, a[i]);
- }else if(c[i] == ){
- add_edge(a[i], b[i]);
- add_edge(a[i]+n, b[i]+n);
- add_edge(b[i], a[i]);
- add_edge(b[i]+n, a[i]+n);
- }else if(c[i] == ){
- add_edge(a[i], b[i]+n);
- add_edge(b[i], a[i]+n);
- }
- }
- scc(n<<);
- for(int i = ; i < n; i++)
- if(cmp[i] == cmp[i+n])
- return false;
- return true;
- }
- int main()
- {
- std::ios::sync_with_stdio(false);
- //freopen("inputD.txt", "r", stdin);
- int T;
- cin>>T;
- while(T--){
- cin>>n>>m;
- for(int i = ; i < m; i++)
- cin>>a[i]>>b[i]>>c[i];
- int l = , r = m, mid, ans;
- while(l <= r){
- mid = (l+r)/;
- if(check(mid)){
- ans = mid;
- l = mid+;
- }else
- r = mid-;
- }
- cout<<ans<<endl;
- }
- return ;
- }
HDU3715(二分+2-SAT)的更多相关文章
- hdu3715 二分+2sat+建图
题意: 给你一个递归公式,每多一层就多一个限制,问你最多能递归多少层. 思路: 先分析每一层的限制 x[a[i]] + x[b[i]] != c[i],这里面x[] = 0,1, ...
- hdu3715 2-sat+二分
Go Deeper 题意:确定一个0/1数组(size:n)使得满足最多的条件数.条件在数组a,b,c给出. 吐槽:哎,一水提,还搞了很久!关键是抽象出题目模型(如上的一句话).以后做二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
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,必需选相 ...
随机推荐
- css中如何实现左边的高度随着右边改变而改变
css中如何实现左边的高度随着右边改变而改变 html结构: <div class="main"> <div class="main_left" ...
- lost+found目录有啥用?
Linux系统中根目录下或者新挂载的磁盘目录下有一个叫lost+found,它的作用是什么? 如果你运行fsck命令(文件系统检查和修复命令),它也许会找到一些数据碎片,这些文件碎片在硬盘中并没有引用 ...
- redis 在 Linux下的安装
redis 和 nginx 一样,都是C语言编写的,所以我们的准备gcc 环境, 之前已经准备好了 没有准备的话(CentOs 有自带):yum install gcc-c++ 解压redis : ...
- per学习笔记-zkclient,curator使用
开源客户端,原生api的不足 连接的创建是异步的,需要开发人员自行编码实现等待 连接没有自动的超时重连机制 Zk本身没提供序列化机制,需要开发人员自行指定,从而实现数据的序列化和反序列化 Watche ...
- Java DB 访问(三)mybatis mapper interface接口
1 项目说明 项目采用 maven 组织 ,依赖 mysql-connector-java,org.mybatis,junit pom 依赖如下: mysql 数据连接 : mysql-connect ...
- xamarin android 需要获取apk签名工具
请打开vs 扩展 搜索 android keystore signature tool 如果是Release 记得查找对应的keystore 文件然后进行获取签名
- JVM中OutOFMemory和StackOverflowError异常代码
1.Out of Memory 异常 右键Run As --->Run Configuration 设置JVM参数 -Xms20m -Xmx20m 上代码: /** * VM Args:-Xms ...
- js中编写velocity逻辑
<script type="text/javascript"> $(function(){ #foreach( $var in $entity.showConfigs ...
- 微信小程序网络封装-简单高效
废话引言 小程序虽然出世很久了,但一直没怎么接触到小程序开发.吉他兴趣班老师想弄一个小程序发布课程信息和打卡功能,作为IT一员就自愿加入了这个小程序开发小组中.虽然小程序面向的是前端工程师,但作为移动 ...
- Java总结:开发环境
更多请查看在线文集:http://android.52fhy.com/java/index.html Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言 ...