博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU - 1816 Get Luffy Out *(二分 + 2-SAT)
阅读量:5072 次
发布时间:2019-06-12

本文共 1869 字,大约阅读时间需要 6 分钟。

题目大意:有N串钥匙,M对锁。每串钥匙仅仅能选择当中一把。怎样选择,才干使开的锁达到最大(锁仅仅能按顺序一对一对开。仅仅要开了当中一个锁就可以)

解题思路:这题跟

这题的限制比較简单。都是二选一,2-SAT的裸题,仅仅只是加了二分而已
附上

#include 
#include
#include
#include
using namespace std;#define N 4010struct Pair{ int x, y;}P[N];int lock1[N], lock2[N], S[N];bool mark[N];int top, n, m;vector
G[N];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;}

转载于:https://www.cnblogs.com/jhcelue/p/7272887.html

你可能感兴趣的文章
我的游戏学习日志33——游戏结构(2)
查看>>
二维数组中的查找
查看>>
htnl5与html4的区别
查看>>
webpack安装及使用
查看>>
linux下IPTABLES配置详解
查看>>
【mysql升级步骤】windows mysql版本升级 ,mysql 5.6 升级到5.7.27
查看>>
Linux内核优化
查看>>
为什么应用程序用户启动时崩溃,使用xcode打开却不会
查看>>
session
查看>>
多线程面试题Top53
查看>>
多线程编程
查看>>
django中模型详解-字段类型与约束条件
查看>>
js学习总结----预解释、作用域、this原理及应用
查看>>
js面试题-----算法类
查看>>
2)添加光标和图标
查看>>
人工智能会伤害人类吗?怎样控制他们?
查看>>
【趟坑】公共引用的jar包 pom的配置方法
查看>>
leetcode 110 Balanced Binary Tree
查看>>
时间单位与存储单位换算
查看>>
OC调用Swift
查看>>