HDU - 1816 Get Luffy Out *(二分 + 2-SAT)
2015-08-11 08:38
232 查看
题目大意:有N串钥匙,M对锁。每串钥匙只能选择其中一把,如何选择,才能使开的锁达到最大(锁只能按顺序一对一对开,只要开了其中一个锁即可)
解题思路:这题跟HDU - 3715 Go Deeper
这题的限制比较简单,都是二选一,2-SAT的裸题,只不过加了二分而已
附上HDU - 3715 Go Deeper题解
解题思路:这题跟HDU - 3715 Go Deeper
这题的限制比较简单,都是二选一,2-SAT的裸题,只不过加了二分而已
附上HDU - 3715 Go Deeper题解
[code]#include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; #define N 4010 struct Pair{ int x, y; }P ; int lock1 , lock2 , S ; bool mark ; int top, n, m; vector<int> G ; void init() { for (int i = 0; i < n; i++) { scanf("%d%d", &P[i].x, &P[i].y); } for (int i = 1; i <= m; i++) scanf("%d%d", &lock1[i], &lock2[i]); } void AddEdge(int x, int valx, int y, int valy) { x = x * 2 + valx; y = y * 2 + valy; G[x ^ 1].push_back(y); G[y ^ 1].push_back(x); } bool dfs(int u) { if (mark[u ^ 1]) return false; if (mark[u]) return true; mark[u] = true; S[++top] = u; for (int i = 0; i < G[u].size(); i++) if (!dfs(G[u][i])) return false; return true; } bool judge(int mid) { for (int i = 0; i < 4 * n; i++) G[i].clear(); for (int i = 0; i < n; i++) AddEdge(P[i].x, 0, P[i].y, 0); for (int i = 1; i <= mid; i++) AddEdge(lock1[i], 1, lock2[i], 1); memset(mark, 0, sizeof(mark)); for (int i = 0; i < 4 * n; i++) { if (!mark[i] && !mark[i ^ 1]) { top = 0; if (!dfs(i)) { while (top) mark[S[top--]] = false; if (!dfs(i ^ 1)) return false; } } } return true; } void solve() { int l = 1, r = m, mid; while (l <= r) { mid = (l + r) / 2; if (judge(mid)) l = mid + 1; else r = mid - 1; } printf("%d\n", l - 1); } int main() { while (scanf("%d%d", &n, &m) != EOF && n + m) { init(); solve(); } return 0; }
相关文章推荐
- 13-读《狼图腾》有感
- [LeetCode]Valid Palindrome
- 图结构练习——判断给定图是否存在合法拓扑序列
- scikit-learn(工程中用的相对较多的模型介绍):2.3. Clustering(可用于特征的无监督降维)
- 软件设计师自我修炼1:如何让用户对软件产生依赖
- android ContentProvider的使用
- 杭电ACM(HDUOJ)试题分类
- MeasureSpec学习
- 动态规划之背包问题
- 计算组合数C(n,m)
- Property list 概述
- 装饰者设计模式
- nyoj32组合数(dfs模板)
- 在Java中辅助报表工具展现json
- 轻松入门React和Webpack
- 线程(2)-----线程池
- 编写Socket客户端和服务器程序,客户端发送一个包含多个数字的字符串给服务器,服务器排序后返回给客户端,要求服务器能连续不断地服务。
- tableView联动
- HDU - 3715 Go Deeper (二分 + 2-SAT)
- linux下的解压命令详解