思路:二分枚举能开的门的数量,将每次枚举转换成2-SAT问题。这里存在的矛盾是假设有门上a,b两个锁,a锁对应于1号钥匙,而一号钥匙的配对是2号钥匙,b锁对应于3号钥匙,3号的配对是4号钥匙。那么2号和4号就不能同时被选,否则有a,b锁的门就开不了。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define Maxn 3010
#define Maxm 1000000
using namespace std;
int dfn[Maxn],low[Maxn],vi[Maxn],head[Maxn],f[Maxn],e,n,m,lab,top,Stack[Maxn],num,id[Maxn],x[Maxn],y[Maxn];
struct Edge{int u,v,next,l;
}edge[Maxm];
void init()
{memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(head,-1,sizeof(head));memset(id,0,sizeof(id));e=lab=num=top=0;
}
void add(int u,int v)
{edge[e].u=u,edge[e].v=v,edge[e].next=head[u],head[u]=e++;
}
void Tarjan(int u)
{int i,j,v;dfn[u]=low[u]=++lab;Stack[top++]=u;vi[u]=1;for(i=head[u];i!=-1;i=edge[i].next){v=edge[i].v;if(!dfn[v]){Tarjan(v);low[u]=min(low[u],low[v]);}if(vi[v])low[u]=min(low[u],dfn[v]);}if(low[u]==dfn[u]){++num;do{i=Stack[--top];vi[i]=0;id[i]=num;}while(i!=u);}
}
int solve(int mid)
{int i,j;init();for(i=1;i<=mid;i++){add(f[x[i]],y[i]);add(f[y[i]],x[i]);}for(i=1;i<=n;i++)if(!dfn[i]){Tarjan(i);}for(i=1;i<=n;i++){if(id[i]==id[f[i]])return 0;}return 1;
}
int main()
{int i,j,a,b;while(scanf("%d%d",&n,&m),n|m){init();memset(f,0,sizeof(f));for(i=1;i<=n;i++){scanf("%d%d",&a,&b);a++,b++;f[a]=b,f[b]=a;}for(i=1;i<=m;i++){scanf("%d%d",x+i,y+i);x[i]++,y[i]++;}n*=2;int l,r,mid;l=0,r=m+1;while(r>l+1){mid=(l+r)>>1;if(solve(mid))l=mid;elser=mid;}printf("%d\n",l);}return 0;
}

转载于:https://www.cnblogs.com/wangfang20/p/3219909.html

poj 2723 2-SAT问题相关推荐

  1. HDU 1816, POJ 2723 Get Luffy Out(2-sat)

    HDU 1816, POJ 2723 Get Luffy Out 题目链接 题意:N串钥匙.每串2把,仅仅能选一把.然后有n个大门,每一个门有两个锁,开了一个就能通过,问选一些钥匙,最多能通过多少个门 ...

  2. ACM POJ 2723 Get Luffy Out(2-SAT入门)

    题目链接:http://poj.org/problem?id=2723 [题目大意] 有2n把钥匙,分成2组,给你每组的钥匙信息,并且每组的钥匙只能用一个. 有m个门,每个门有2个锁,只要打开一个锁这 ...

  3. POJ 2723 Get Luffy Out【二分+2-sat】

    题意:已知有 2*n把钥匙,这些钥匙两两一组,每组只能用其中的一把钥匙,有 m 个门,每个门上有两把锁,只要有一把锁被打开门就可以被打开, 一个门上可能是两把相同的锁,不同的门上也有可能有相同的锁,给 ...

  4. hdu1816 + POJ 2723开锁(二分+2sat)

    题意:      有m层门,我们在最外层,我们要一层一层的进,每一层上有两把锁,我们只要开启其中的一把们就会开,我们有n组钥匙,每组两把,我们只能用其中的一把,用完后第二把瞬间就会消失,问你最多能开到 ...

  5. POJ 2723 2-SAT

    题意: 有2n把钥匙,每2个一组,给你每组的钥匙信息,并且每组的钥匙只能用一个.有m个门,每个门有2个锁,只要打开一个锁这个门就开了.问你最多能够打开多少个门. PS:打开门必须是有序的,即你想要打开 ...

  6. poj pku图论、网络流入门题总结、汇总

    poj pku图论.网络流入门题总结.汇总 分类: acm图论 2010-08-25 18:49 243人阅读 评论(0) 收藏 举报 网络算法networkgraphconstructioninte ...

  7. POJ 图论分类 + DP(较全 自己又加了点)

    DP -----------动态规划 状态压缩DP 2411 (棋盘规模较大)状态压缩DP+DFS+滚动数组 2664 (棋盘规模较小)直接递推即可(DP) 2506 (棋盘规模较小)直接递推即可(D ...

  8. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  9. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

最新文章

  1. Nginx最新版安装教程(Windows+Linux)
  2. do……while 循环
  3. 五款主流 Linux 发行版性能对比,稳而不强?
  4. gdb 扩展 默认参数_默认方法一种扩展旧代码的方法
  5. GB/T 17626 电磁兼容 试验和测量技术系列标准【归纳】
  6. 2012年下半年我国信息化和信息安全走势分析与预测
  7. 如何在程序中画出实际大小为7CM半径的圆
  8. Flink Weekly | 每周社区动态更新(附5月活跃榜单)
  9. 【存储】超融合(HCI)和云是什么以及区别
  10. java rgb yuv_RGB,CMY(K),YUV,YIQ,YCbCr顏色的轉換算法(java實現)
  11. Aras Innovator 完整安装详细教程
  12. 投影仪全国产化电子元件推荐方案
  13. 泰克Tektronix示波器软件TDS420|TDS430|TDS460上位机软件NS-Scope
  14. Power bi 4.20 词云
  15. Java分布式锁那点事
  16. jenkins自动化打包android,Android使用Jenkins实现自动化打包
  17. [java][45]MyEclipse2017破解后闪退问题
  18. 线性回归方程b保留几位小数_线性回归的这些细节,你都搞明白了吗?
  19. ios运行html时黑屏,原神ios黑屏打不开怎么办?原神ios闪退解决方法
  20. css如何实现鼠标移至图片上显示遮罩层及文字

热门文章

  1. ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例
  2. JSON与Java对象的互相转换
  3. .魔术方法、魔术常量
  4. ubuntu 修改和配置ip
  5. Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
  6. sqlplus 调试存储过程
  7. [Vue.js] 基础 -- 过滤器(格式化时间)
  8. Vuejs 事件监听
  9. javascript实现的复制到剪贴板
  10. 用js实现改变随意改变div属性style的名称和值的结果