hdu3715 二分+2sat+建图
题意:
给你一个递归公式,每多一层就多一个限制,问你最多能递归多少层。
思路:
先分析每一层的限制 x[a[i]] + x[b[i]] != c[i],这里面x[] = 0,1,c[i] = 0,1,2
如果我们把 x[]=0,1想成取或不取,就是基础的关系,那么这个题目就可以直接抽象成2sat问题,然后我们二分去枚举深度,每次根据2sat的结果判断二分走向,我的2sat用的是双深搜的强连通,用那个t打头的也行,随意,这样这个题目就ok了,对了下面总结下2sat的建图吧,这个题目也能用上。
- #include<stdio.h>
- #include<string.h>
- #include<stack>
- #define N_node 500 + 10
- #define N_edge 100000 + 100
- using namespace std;
- typedef struct
- {
- int to ,next;
- }STAR;
- STAR E1[N_edge] ,E2[N_edge];
- int list1[N_node] ,list2[N_node] ,tot;
- int Belong[N_node] ,cnt;
- int mark[N_node];
- int A[11000] ,B[11000] ,C[11000];
- stack<int>st;
- void add(int a ,int b)
- {
- E1[++tot].to = b;
- E1[tot].next = list1[a];
- list1[a] = tot;
- E2[tot].to = a;
- E2[tot].next = list2[b];
- list2[b] = tot;
- }
- void DFS1(int s)
- {
- mark[s] = 1;
- for(int k = list1[s] ;k ;k = E1[k].next)
- if(!mark[E1[k].to]) DFS1(E1[k].to);
- st.push(s);
- }
- void DFS2(int s)
- {
- mark[s] = 1;
- Belong[s] = cnt;
- for(int k = list2[s] ;k ;k = E2[k].next)
- if(!mark[E2[k].to]) DFS2(E2[k].to);
- }
- bool ok(int mid ,int n)
- {
- memset(list1 ,0 ,sizeof(list1));
- memset(list2 ,0 ,sizeof(list2));
- tot = 1;
- for(int i = 1 ;i <= mid ;i ++)
- {
- int x = A[i] * 2 ,xx = A[i] * 2 + 1;
- int y = B[i] * 2 ,yy = B[i] * 2 + 1;
- if(C[i] == 0) add(xx ,y) ,add(yy ,x);
- if(C[i] == 1) add(x ,y) ,add(y ,x) ,add(xx ,yy) ,add(yy ,xx);
- if(C[i] == 2) add(y ,xx) ,add(x ,yy);
- }
- memset(mark ,0 ,sizeof(mark));
- while(!st.empty()) st.pop();
- for(int i = 0 ;i < n * 2 ;i ++)
- if(!mark[i]) DFS1(i);
- memset(mark ,0 ,sizeof(mark));
- cnt = 0;
- while(!st.empty())
- {
- int xin = st.top();
- st.pop();
- if(mark[xin]) continue;
- cnt ++;
- DFS2(xin);
- }
- int mk = 0;
- for(int i = 0 ;i < n * 2 && !mk ;i += 2)
- if(Belong[i] == Belong[i^1]) mk = 1;
- return !mk;
- }
- int main ()
- {
- int t ,n ,m ,i;
- scanf("%d" ,&t);
- while(t--)
- {
- scanf("%d %d" ,&n ,&m);
- for(i = 1 ;i <= m ;i ++)
- scanf("%d %d %d" ,&A[i] ,&B[i] ,&C[i]);
- int low ,mid ,up ,ans = 0;
- low = 0 ,up = m;
- while(low <= up)
- {
- mid = (low + up) >> 1;
- if(ok(mid ,n))
- ans = mid ,low = mid + 1;
- else up = mid - 1;
- }
- printf("%d\n" ,ans);
- }
- return 0;
- }
hdu3715 二分+2sat+建图的更多相关文章
- HDU 3036 Escape 网格图多人逃生 网络流||二分匹配 建图技巧
题意: 每一个' . '有一个姑娘, E是出口,'.'是空地 , 'X' 是墙. 每秒钟每一个姑娘能够走一步(上下左右) 每秒钟每一个出口仅仅能出去一个人 给定n*m的地图, 时限T 问全部姑娘是否能 ...
- poj 3648 2-SAT建图+topsort输出结果
其实2-SAT类型题目的类型比较明确,基本模型差不多是对于n组对称的点,通过给出的限制条件建图连边,然后通过缩点和判断冲突来解决问题.要注意的是在topsort输出结果的时候,缩点后建图需要反向连边, ...
- HDU3715(二分+2-SAT)
Go Deeper Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- TTTTTTTTTTTTTTTTT POJ 2226 草地覆木板 二分匹配 建图
Muddy Fields Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9754 Accepted: 3618 Desc ...
- TTTTTTTTTTTTTTTTTT POJ 2724 奶酪消毒机 二分匹配 建图 比较难想
Purifying Machine Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5004 Accepted: 1444 ...
- poj 3683 2-sat建图+拓扑排序输出结果
发现建图的方法各有不同,前面一题连边和这一题连边建图的点就不同,感觉这题的建图方案更好. 题意:给出每个婚礼的2个主持时间,每个婚礼的可能能会冲突,输出方案. 思路:n个婚礼,2*n个点,每组点是对称 ...
- Eliminate the Conflict HDU - 4115(2-sat 建图 hhh)
题意: 石头剪刀布 分别为1.2.3,有n轮,给出了小A这n轮出什么,然后m行,每行三个数a b k,如果k为0 表示小B必须在第a轮和第b轮的策略一样,如果k为1 表示小B在第a轮和第b轮的策略不一 ...
- poj 3678 Katu Puzzle 2-SAT 建图入门
Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...
- POJ 2391 Ombrophobic Bovines ( 经典最大流 && Floyd && 二分 && 拆点建图)
题意 : 给出一些牛棚,每个牛棚都原本都有一些牛但是每个牛棚可以容纳的牛都是有限的,现在给出一些路与路的花费和牛棚拥有的牛和可以容纳牛的数量,要求最短能在多少时间内使得每头牛都有安身的牛棚.( 这里注 ...
随机推荐
- Node更丝滑的打开方式
Node更丝滑的打开方式 1. 使用背景 最近前端的一个项目,使用gulp作为工程化.在运行过程中出现如下错误 gulp[3192]: src\node_contextify.cc:628: Asse ...
- 在 .NET Core 中应用六边形架构
在本文中,您会看到一个Web API应用的模板,在.NET Core 中应用了六边形架构,并且里面包含了一些基础功能. 介绍 这是一个模板项目,里面集成了一些必备的基础功能,当我们需要开发一个新项目时 ...
- ORM框架 和 面向对象编程
ORM框架: 1.SQLAlchemy: - 作用 1.提供简单的规则 2.自动转换成SQL语句 - DB first/code first DB first: 手动创建数据库以及表 ...
- Springboot 轻量替代框架 Solon 1.3.10 发布
Solon 是一个微型的Java开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC.REST ...
- 什么是ETL?
一.ETL概念之背景 随着企业的发展,目前的业务线越来越复杂,各个业务系统独立运营.例如:CRM系统只会生产CRM的 数据:Billing只会生产Billing的数据.各业务系统之间只关心自己的数据, ...
- 三分钟教你提升应用推送的ROI
推送是App应用性价比最高也是最直接的营销运营手段,其细节颇多,非常考验运营人员的功力,本文将从ROI角度来分析怎么提升营销类推送的收益.(非IM类.系统类等功能服务型推送) 以一个日活100万的应用 ...
- Memory Networks02 记忆网络经典论文
目录 1 Recurrent Entity Network Introduction 模型构建 Input Encoder Dynamic Memory Output Model 总结 2 hiera ...
- HashMap源码阅读(小白的java进阶)
OverView 构造方法 //构造方法 public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < ...
- Python基础【基本数据类型】
基本数据类型分类 数字 int 字符串 str 列表 list 字典 dict 元祖 tuple ...
- P1008_三连击(JAVA语言)
/* * 题目描述 将1,2,⋯,9共9个数分成3组, 分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数. 输入输出格式 输入格式: 木有输入 输出格式: 若 ...