【BZOJ】3495: PA2010 Riddle
题意
\(n(1 \le n \le 1000000)\)个城市,\(k(1 \le k \le n)\)个国家,\(m(1 \le m \le 1000000)\)条边。要求每个国家有且仅有一个首都,每条边两端的城市至少要有一个首都。判断是否有解。
分析
满足性问题。而且每个城市只有两种情况,首都or不是首都。所以考虑2-sat
题解
对于每一个点,拆点为\(i\)和\(i'\),表示有首都和无首都。
对于每一个国家(假设有\(a\)个城市),由于只有一个首都,也就是说,假设这个国家的第\(j\)城市是首都,则前\(j-1\)个城市和后\(a-j\)个城市都不是首都!对应着前缀和和后缀和为0!
所以我们对每个国家建立前缀和和后缀和的结点,由于只有两种情况,0和1,所以照样用2-sat可以解决。
至于怎么连边,自己yy一下,很简单的。
#include <bits/stdc++.h>
using namespace std;
const int N=1000005*6, M=1000005*12;
int ihead[N], cnt, FF[N], LL[N], p[N], scc, tot;
struct E {
int next, to;
}e[M];
void add(int x, int y) {
e[++cnt]=(E){ihead[x], y}; ihead[x]=cnt;
}
void dfs(int x) {
static int tid=0, s[N], vis[N], top=0;
s[++top]=x;
vis[x]=1;
FF[x]=LL[x]=++tid;
for(int i=ihead[x]; i; i=e[i].next) {
int y=e[i].to;
if(!FF[y]) {
dfs(y);
LL[x]=min(LL[x], LL[y]);
}
else if(vis[y]) {
LL[x]=min(LL[x], FF[y]);
}
}
if(FF[x]==LL[x]) {
++scc;
int y;
do {
y=s[top--];
vis[y]=0;
p[y]=scc;
} while(x!=y);
}
}
bool check() {
for(int i=1, all=tot<<1|1; i<=all; ++i) {
if(!FF[i]) {
dfs(i);
}
}
for(int i=1; i<=tot; ++i) {
if(p[i<<1]==p[i<<1|1]) {
return 0;
}
}
return 1;
}
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for(int i=1; i<=m; ++i) {
int x, y;
scanf("%d%d", &x, &y);
add(x<<1|1, y<<1);
add(y<<1|1, x<<1);
}
tot=n;
for(int j=1; j<=k; ++j) {
scanf("%d", &m);
for(int i=1; i<=m; ++i) {
int a;
scanf("%d", &a);
int now=tot+i;
if(i!=1) {
add(now<<1|1, (now-1)<<1|1);
add((now-1)<<1, now<<1);
add(a<<1, (now-1)<<1|1);
}
else {
add(a<<1|1, now<<1|1);
}
add(now<<1|1, a<<1|1);
add(a<<1, now<<1);
now=tot+m+i;
if(i!=m) {
add(now<<1|1, (now+1)<<1|1);
add((now+1)<<1, now<<1);
add(a<<1, (now+1)<<1|1);
}
else {
add(a<<1|1, now<<1|1);
}
add(now<<1|1, a<<1|1);
add(a<<1, now<<1);
}
tot+=2*m;
}
puts(check()?"TAK":"NIE");
return 0;
}
【BZOJ】3495: PA2010 Riddle的更多相关文章
- 【BZOJ】3495: PA2010 Riddle 2-SAT算法
[题意]有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都.n,m,k<=10^6. [算法]2-SAT,前后缀优化建图 [题解] ...
- 3495: PA2010 Riddle 2-sat 前缀优化
3495: PA2010 Riddle 2-sat 前缀优化 链接 bzoj 思路 不想说啥了,看hwim的吧,我去睡觉了zZ. 代码 /******************************* ...
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- 【BZOJ】1013: [JSOI2008]球形空间产生器sphere
[BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...
- 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
- 3495: PA2010 Riddle
3495: PA2010 Riddle 链接 分析: 每个点要么建首都,要么不建,并且一个点建了,会导致一些点不能建.所以可以考虑2-sat. 但是如果在每个郡里两两连边,边数是n^2的. 考虑用前缀 ...
- 【BZOJ】【3083】遥远的国度
树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...
随机推荐
- 【09-23】js原型继承学习笔记
js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...
- 2015.4.19 为什么footer下a的索引值那么大
1.问题demo:为什么footer下a的索引值那么大,index不是查找兄弟级别的元素么?而且还限定了范围在footer下的a的情况下. 解决方法:alert( $("#footer a& ...
- hzwer模拟赛 虫洞
[题目描述] N个虫洞,M条单向跃迁路径.从一个虫洞沿跃迁路径到另一个虫洞需要消耗一定量的燃料和1单位时间.虫洞有白洞和黑洞之分.设一条跃迁路径两端的虫洞质量差为delta. 1.从白洞跃迁到黑洞,消 ...
- ViewHolder的改进写法
先看看ViewHolder通用写法 ViewHolder holder = null; if(convertView == null){ ...
- Effective Java Second Edition --- Builder Pattern
如果类的构造器或者静态工厂中有多个参数,设计这种类时,Builder模式是一种不错的选择,特别是当大多数参数是可选的时候. 与使用传统的重载构造函数模式相比,使用Builder模式的客户端代码更易于阅 ...
- jQuery入门(3)事件与事件对象
jQuery入门(1)jQuery中万能的选择器 jQuery入门(2)使用jQuery操作元素的属性与样式 jQuery入门(3)事件与事件对象 jQuery入门(4)jQuery中的Ajax()应 ...
- ajax请求webservice的过程中遇到的问题总结
前台用ajax的post方法,无法请求到webservice中的方法的时候,需要在配置文件中添加 web.config文件中的 <system.web> 节点下加入:<webServ ...
- webview滑动事件 与内部html左右滑动事件冲突问题的解决办法
最近在做个混合app , 用html做页面,然后通过webview嵌套在activity中,效果是这样: 开始还是比较顺利,增加了菜单退出按钮,返回键页面回退功能,页面加载显示加载图标(在app端实现 ...
- git 简单使用
创建新分支:git branch branchName 切换到新分支:git checkout branchName 然后 ,上面两个命令也可以合成为一个命令: git checkout -b bra ...
- MYSQL(二)
上一篇文章讲的是mysql的基本操作,这一篇会有一点难以理解,本节主要内容mysql视图,存储过程,函数,事务,触发器,以及动态执行sql 视图view 视图是一个虚拟表,其内容由查询定义.同真实的表 ...