博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2723 2sat判断解+二分
阅读量:6756 次
发布时间:2019-06-26

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

典型的2-sat问题,题意:有m个门,每个门上俩把锁,开启其中一把即可,现在给n对钥匙(所有

钥匙编号0123456...2n-1),每对钥匙只能用一把,要求尽可能开门多(按顺序,前max个)。

关键是题意的分析与转化,只能选一?必然2-sat,每给一对门上的锁对应钥匙的编号,说:必需要这

俩把钥匙的一把(至少),即:a^b,所以,建图了可以,总结通法:对应的数据编号:0123..,每个
数代表原来的一个“状态”/“命题”/“数据”,使之01为一对(只取一个),23一对,...依次,建图
此题要求最值,二分即可。
注意点(WA之因):1.编号后全图全按编号走啊!原来数据基本无用,只是有时候输出时之用,或建立
数据双向关系!2.对于每次二分,对应数要重新建图,注意初始化!

ps:一晚没成功,结果早上起来2分钟,AC!上午效率就是高!切记不可熬夜!身体健康第一位!

#include
//36MS#include
#include
#include
#include
using namespace std;const int MAX=3000;vector
keys(MAX);int n,m;int times=0;int belong[MAX];int low[MAX];int dfn[MAX];int visited[MAX];int isinstack[MAX];stack
s;int scc[MAX];int numblock=0;struct request //条件{ int a,b;};request requests[MAX];vector
>edges(MAX); //图void clear(){ times=numblock=0; for(int i=0;i<2*n;i++) { visited[i]=dfn[i]=low[i]=isinstack[i]; scc[i]=-1; edges[i].clear(); }}void tarjan(int u) //dfs{ dfn[u]=low[u]=++times; isinstack[u]=1; s.push(u); int len=edges[u].size(); for(int i=0;i
low[v])low[u]=low[v]; } else if(isinstack[v]&&dfn[v]
left) //二分之 { mid=(left+right)/2; if(mid==count&&mid==left) //注意出口! { if(check(left+1))left++; break; } if(check(mid)) left=mid; else right=mid; count=mid; } printf("%d\n",left); }}

转载于:https://www.cnblogs.com/yezekun/p/3925811.html

你可能感兴趣的文章
MIPS program a block of C
查看>>
第六章 类型和成员基础
查看>>
WIN7切换用户
查看>>
接口测试(五)--Http headers
查看>>
1175:除以13
查看>>
DataSet转换为Byte[]方法
查看>>
Centos文件查看命令字符
查看>>
DSP c6678的启动方式
查看>>
遮罩层点击空白退出代码
查看>>
[HNOI2012]集合选数 BZOJ2734
查看>>
SpringCloud之Eureka集群
查看>>
转 asterisk拨号规则
查看>>
PS1修改xshell命令行样式
查看>>
部门表递归查询
查看>>
Analysis by Its History Exercise 2.3
查看>>
陶哲轩实分析 习题 7.1.5
查看>>
团队项目—后续阶段第三天
查看>>
python中的gil是什么?
查看>>
BFS 2015百度之星初赛2 HDOJ 5254 棋盘占领
查看>>
黑马程序员 ——ios点语法和类的三大特性
查看>>