LOJ2723 Get Luffy Out

题目大意:给你n对钥匙,每对钥匙只可以用其中的任意一个,钥匙有编号,且不重复。有m个大门,每个门上有两个锁,每个锁对应一个编号的钥匙,只要打开两个锁中的一个就可以打开门。问用这n对钥匙最多可以打开多少大门(门有顺序)?

——————————————————————————————————————————————

每一个大门要打开,要么用A钥匙,要么用B钥匙,这是明现的2-SAT问题。

同一对钥匙,用了A钥匙就一定不能用B钥匙。

对于最多可以打开多少门,因为门有顺序,所以要二分答案。

——————————————————————————————————————————————

 1 #include<cstdio>
2 #include<iostream>
3 #include<algorithm>
4 #include<cstring>
5 using namespace std;
6 const int maxn=1050;
7 const int maxm=2100;
8 int n,m;
9 int keys[maxn<<1],doors[maxm][2];
10 struct edge
11 {
12 int u,v,nxt;
13 }e[maxm<<1];
14 int head[maxn<<1],js;
15 void addage(int u,int v)
16 {
17 e[++js].u=u;e[js].v=v;
18 e[js].nxt=head[u];head[u]=js;
19 }
20 int low[maxm<<1],dfn[maxm<<1],cnt,st[maxm<<1],top,lt[maxm<<1],lts;
21 void tarjan(int u)
22 {
23 low[u]=dfn[u]=++cnt;
24 st[++top]=u;
25 for(int i=head[u];i;i=e[i].nxt)
26 {
27 int v=e[i].v;
28 if(!dfn[v])
29 {
30 tarjan(v);
31 low[u]=min(low[u],low[v]);
32 }
33 else if(!lt[v]) low[u]=min(low[u],dfn[v]);
34 }
35 if(low[u]==dfn[u])
36 {
37 lt[u]=++lts;
38 while(st[top]!=u)lt[st[top--]]=lts;
39 --top;
40 }
41 }
42 bool pd(int x)
43 {
44 memset(head,0,sizeof head);
45 js=0;
46 for(int a,b,i=0;i<x;++i)
47 {
48 a=doors[i][0],b=doors[i][1];
49 if(a==b)addage(keys[a]^1,keys[a]);
50 else
51 {
52 addage(keys[a]^1,keys[b]);
53 addage(keys[b]^1,keys[a]);
54 }
55 }
56 memset(low,0,sizeof low);
57 memset(dfn,0,sizeof dfn);
58 cnt=0;
59 memset(lt,0,sizeof lt);
60 lts=0;
61 top=0;
62 for(int i=2;i<n*2+2;++i)
63 if(!dfn[i])tarjan(i);
64 for(int i=1;i<n+1;++i)
65 if(lt[i<<1]==lt[(i<<1)^1])return 0;
66 return 1;
67 }
68 int main()
69 {
70 while(scanf("%d%d",&n,&m),n+m)
71 {
72 for(int a,b,i=1;i<=n;++i)
73 {
74 scanf("%d%d",&a,&b);
75 keys[a]=i<<1;
76 keys[b]=(i<<1)^1;
77 }
78 for(int i=0;i<m;++i)
79 scanf("%d%d",&doors[i][0],&doors[i][1]);
80 int l=0,r=m,ans=0;
81 while(l<=r)
82 {
83 int mid=(l+r)>>1;
84 if(pd(mid))ans=mid,l=mid+1;
85 else r=mid-1;
86 }
87 printf("%d\n",ans);
88 }
89 return 0;
90 }

LOJ2723的更多相关文章

随机推荐

  1. mysql 提示 vcruntime140_1.dll丢失

    百度网盘:https://pan.baidu.com/s/1vbVexHs1eRfGlnTbr8U53Q 提取码:59tm 将两个文件同时放到路径:C:\Windows\System32 下,运行ba ...

  2. 一个关于JVM类初始化问题

    刚在看虚拟机相关知识点 看到一段代码,大家猜测一下这段代码会触发子类初始化吗 public class SuperClass{ static{ system.out.println("Sup ...

  3. java内部类 之private 属性对其他对象的访问限制

    public class InnerClass1 { private class Content { private int i; public int value() { // TODO Auto- ...

  4. orcl数据库自定义函数--金额小写转大写

    很多时候在打印票据的时候需要用到大写,ireport无法转换,只能先在查询语句里面进行转换,首先定义好函数,之后再调用函数 CREATE OR REPLACE Function MoneyToChin ...

  5. spark知识点_datasources

    来自官网DataFrames.DataSets.SQL,即sparkSQL模块. 通过dataframe接口,sparkSQL支持多种数据源的操作.可以把dataframe注册为临时视图,也可以通过关 ...

  6. 音视频入门-19-使用giflib处理GIF图片

    * 音视频入门文章目录 * GIFLIB The GIFLIB project 上一篇 [手动生成一张GIF图片], 自己生成了一张 GIF 动态图 rainbow.gif. 下面,使用 GIFLIB ...

  7. Task1:知识图谱介绍(1天)

    一.知识图谱简介 "知识图谱本质上是语义网络(Semantic Network)的知识库".但这有点抽象,所以换个角度,从实际应用的角度出发其实可以简单地把知识图谱理解成多关系图( ...

  8. MySql中的有条件插入 insert where

    假设现在我们有这样的需求:当数据库中不存在满足条件的记录时,可以插入一条记录,否则程序退出.该怎么实现? 1年以上工作经验的人应该都能立即想到:去检查一下库里有没有记录,没有就插入,有就结束. int ...

  9. zabbix v3.0安装部署【转】

    关于zabbix及相关服务软件版本: Linux:oracle linux 6.5 nginx:1.9.15 MySQL:5.5.49 PHP:5.5.35 一.安装nginx: 安装依赖包: yum ...

  10. 【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization

    Azure Active Directory (Azure AD) is Microsoft's cloud-based identity and access management service, ...