2723

 
  
1 /*
2 门是按顺序打开的,这点非常重要。
3
4 2SAT,建图,判断有有解
5 关于限制条件,对于key pair.有关系 a and b = 0,最多只能用1个,a1b0,a0b1,a0b0
6 对于门上的key pair,有关系 a or b = 1,只要有一个是1就行,a1b1 a1b0 a0b1
7 关系转化为边,可参考3678
8
9 可用二分加速
10 */
11
12 // include file
13 #include < cstdio >
14 #include < cstdlib >
15 #include < cstring >
16 #include < cmath >
17 #include < cctype >
18 #include < ctime >
19
20 #include < iostream >
21 #include < sstream >
22 #include < fstream >
23 #include < iomanip >
24 #include < bitset >
25 #include < strstream >
26
27 #include < algorithm >
28 #include < string >
29 #include < vector >
30 #include < queue >
31 #include < set >
32 #include < list >
33 #include < functional >
34
35 using namespace std;
36
37 // typedef
38 typedef long long LL;
39 typedef unsigned long long ULL;
40
41 //
42 #define read freopen("in.txt","r",stdin)
43 #define write freopen("out.txt","w",stdout)
44 #define FORi(a,b) for(int i=(a);i<(b);i++)
45 #define FORj(a,b) for(int j=(a);j<(b);j++)
46
47 #define FF(i,a) for(int i=0;i<(a);i+++)
48 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
49 #define Z(a) (a<<1)
50 #define Y(a) (a>>1)
51
52 const double eps = 1e - 11 ;
53 const double Pi = acos( - 1.0 );
54
55 template < class T > inline T sqr(T a){ return a * a;}
56 template < class T > inline T TMAX(T x,T y)
57 {
58 if (x > y) return x;
59 return y;
60 }
61 template < class T > inline T TMIN(T x,T y)
62 {
63 if (x < y) return x;
64 return y;
65 }
66 template < class T > inline T MMAX(T x,T y,T z)
67 {
68 return TMAX(TMAX(x,y),z);
69 }
70
71
72 // code begin
73 #define MAXN 5010
74
75 struct node
76 {
77 int a,b;
78 };
79
80 node key[MAXN];
81 node door[MAXN];
82
83 vector < int > G[MAXN];
84
85 int scc;
86 int cnt;
87 int used[MAXN];
88 int stk1[MAXN],top1;
89 int stk2[MAXN],top2;
90 int isin[MAXN];
91 int dfn[MAXN];
92 int low[MAXN];
93 int id[MAXN];
94 int N,M;
95
96 void gabow_scc( int i)
97 {
98 used[i] = true ;
99 stk1[top1 ++ ] = i;
100 stk2[top2 ++ ] = i;
101 dfn[i] = cnt ++ ;
102 isin[i] = true ;
103
104 FORj( 0 ,G[i].size() )
105 {
106 if ( ! used[ G[i][j] ])
107 {
108 gabow_scc(G[i][j]);
109 }
110 else if (isin[G[i][j]])
111 {
112 while (dfn[stk2[top2 - 1 ]] > dfn[G[i][j]])
113 top2 -- ;
114 }
115 }
116
117 if (i == stk2[top2 - 1 ])
118 {
119 top2 -- ;
120 int w;
121 do
122 {
123 w = stk1[ -- top1];
124 isin[w] = false ;
125 id[w] = scc;
126 } while (w != i);
127
128 scc ++ ;
129 }
130 }
131
132 void tarjan_scc( int i)
133 {
134 used[i] = true ;
135 stk1[top1 ++ ] = i;
136 dfn[i] = cnt;
137 low[i] = cnt;
138 cnt ++ ;
139 isin[i] = true ;
140
141 FORj( 0 ,G[i].size())
142 {
143 if ( ! used[ G[i][j] ])
144 {
145 tarjan_scc(G[i][j]);
146 low[i] = TMIN(low[i],low[G[i][j]]);
147 }
148 else if (isin[G[i][j]])
149 {
150 low[i] = TMIN(low[i],dfn[G[i][j]]);
151 }
152 }
153
154 if (dfn[i] == low[i])
155 {
156 int w;
157 do
158 {
159 w = stk1[ -- top1];
160 isin[w] = false ;
161 id[w] = scc;
162 } while (w != i);
163 scc ++ ;
164 }
165 }
166
167 void build_G( int sz)
168 {
169 FORi( 0 ,N * 4 )
170 {
171 G[i].clear();
172 }
173 int a,b;
174 FORi( 0 ,N)
175 {
176 // a and b = 0
177 a = key[i].a;
178 b = key[i].b;
179 G[ 2 * a + 1 ].push_back( 2 * b);
180 G[ 2 * b + 1 ].push_back( 2 * a);
181 }
182 FORi( 0 ,sz)
183 {
184 // a or b = 1
185 a = door[i].a;
186 b = door[i].b;
187 G[ 2 * a].push_back( 2 * b + 1 );
188 // G[2*b+1].push_back(2*a);
189 G[ 2 * b].push_back( 2 * a + 1 );
190 // G[2*a+1].push_back(2*b);
191 }
192 }
193
194 bool SAT( int mid)
195 {
196 if (mid == 0 ) return true ;
197 memset(used, 0 , sizeof (used));
198 memset(id, 0 , sizeof (id));
199 top1 = top2 = 0 ;
200 cnt = 1 ;
201 scc = 1 ;
202 memset(isin, 0 , sizeof (isin));
203 memset(dfn, 0 , sizeof (dfn));
204 memset(low, 0 , sizeof (low));
205 FORi( 0 ,N * 4 )
206 {
207 if ( ! used[i])
208 {
209 // gabow_scc(i);
210 tarjan_scc(i);
211 }
212 }
213
214 FORi( 0 ,N * 2 )
215 {
216 if (id[ 2 * i] == id[ 2 * i + 1 ])
217 return false ;
218 }
219 return true ;
220 }
221
222 int main()
223 {
224 read;
225 write;
226 while (scanf( " %d %d " , & N, & M) !=- 1 )
227 {
228 if (N + M == 0 ) break ;
229
230 int a,b;
231 FORi( 0 ,N)
232 {
233 scanf( " %d %d " , & a, & b);
234 key[i].a = a;
235 key[i].b = b;
236 }
237
238 FORi( 0 ,M)
239 {
240 scanf( " %d %d " , & a, & b);
241 door[i].a = a;
242 door[i].b = b;
243 }
244
245 // 0..M
246 int L = 0 ,R = M + 1 ,ans = 0 ;
247
248 while (L < R)
249 {
250 int mid = Y(L + R);
251 // 0到mid-1建模
252
253 build_G(mid);
254 if (SAT(mid))
255 {
256 if (mid > ans) ans = mid;
257 L = mid + 1 ;
258 }
259 else R = mid;
260 }
261
262 printf( " %d\n " ,ans);
263 }
264 return 0 ;
265 }

转载于:https://www.cnblogs.com/ac2012/archive/2011/02/28/1967468.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值