3495: PA2010 Riddle
3495: PA2010 Riddle
分析:
每个点要么建首都,要么不建,并且一个点建了,会导致一些点不能建。所以可以考虑2-sat。
但是如果在每个郡里两两连边,边数是n^2的。
考虑用前缀优化。
S[i]表示对于当前郡,前i个点中是否存在一个首都,A[i]表示i这个点是否建首都。
1、那么有A[i]=1,则S[i]=1,同样有它的逆否命题:S[i]=0,则A[i]=0。
2、根据前缀的性质有S[i-1]=1,则S[i]=1,逆否命题:S[i]=0,则S[i-1]=0。
3、由于每个郡只能有一个首都,所以A[i]=1,则S[i-1]=0,逆否命题:S[i-1]=1,则A[i]=0。
4、还有满足每条边两边至少一个首都,u=0,则v=1,逆否命题:v=0,则u=1
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
struct Edge{ int to, nxt; } e[N << ];
int head[N], dfn[N], low[N], bel[N], sk[N], top, Index, tot, En;
bool vis[N]; inline void add_edge(int u,int v) {
++En; e[En].to = v, e[En].nxt = head[u]; head[u] = En;
}
void tarjan(int u) {
low[u] = dfn[u] = ++Index;
sk[++top] = u; vis[u] = ;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
}
if (vis[v]) low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
++tot;
do {
vis[sk[top]] = ;
bel[sk[top]] = tot;
top --;
} while (sk[top + ] != u);
}
}
int main() {
int n = read(), m = read(), k = read();
for (int u, v, i = ; i <= m; ++i) {
u = read(), v = read();
add_edge(u + n, v);add_edge(v + n, u);
}
for (int i = ; i <= n; ++i) // A[i]=1,S[i]=1
add_edge(i, i + * n), add_edge(i + * n, i + n);
for (int cnt, now, last, i = ; i <= k; ++i) {
cnt = read(), last = read();
for (int j = ; j <= cnt; ++j) {
now = read();
add_edge(last + * n, now + * n);add_edge(now + * n, last + * n); // S[i-1]=1,S[i]=1
add_edge(now, last + * n); add_edge(last + * n, now + n); // A[i]=1,S[i-1]=0
last = now;
}
}
for (int i = ; i <= (n << ); ++i) if (!dfn[i]) tarjan(i);
for (int i = ; i <= n; ++i) {
if (bel[i] == bel[i + n] || bel[i + * n] == bel[i + * n]) {
puts("NIE"); return ;
}
}
puts("TAK");
return ;
}
3495: PA2010 Riddle的更多相关文章
- 3495: PA2010 Riddle 2-sat 前缀优化
3495: PA2010 Riddle 2-sat 前缀优化 链接 bzoj 思路 不想说啥了,看hwim的吧,我去睡觉了zZ. 代码 /******************************* ...
- 【BZOJ】3495: PA2010 Riddle
题意 \(n(1 \le n \le 1000000)\)个城市,\(k(1 \le k \le n)\)个国家,\(m(1 \le m \le 1000000)\)条边.要求每个国家有且仅有一个首都 ...
- BZOJ.3495.[PA2010]Riddle(2-SAT 前缀优化建图)
题目链接 每个城市要么建首都要么不建,考虑2-SAT 这样一个国家内城市两两连边是很显然的,但是边数为O(n^2) 每个国家中仅有一个建首都,考虑新建前缀S[i]=1/0这2n个点表示当前国家的[1, ...
- 【刷题】BZOJ 3495 PA2010 Riddle
Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边. 要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. Input 第一行有三个整数,城镇数n(1<=n& ...
- 【BZOJ】3495: PA2010 Riddle 2-SAT算法
[题意]有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都.n,m,k<=10^6. [算法]2-SAT,前后缀优化建图 [题解] ...
- 【bzoj 3495】PA2010 Riddle
Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. Input 第一行有三个整数,城镇数n(1<=n&l ...
- BZOJ3495 : PA2010 Riddle
2-SAT. 建立n个变量,其中第i个变量表示第i个城市是否是首都. 对于边(x,y),连边x->y',y->x'. 对于一个有y个城市的国家,新建2y个变量,分别表示前i个城市和后i个城 ...
- BZOJ3495 PA2010 Riddle 【2-sat】
题目链接 BZOJ3495 题解 每个城市都有选和不选两种情况,很容易考虑到2-sat 边的限制就很好设置了,主要是每个郡只有一个首都的限制 我们不可能两两之间连边,这样复杂度就爆炸了 于是乎就有了一 ...
- 【BZOJ3495】PA2010 Riddle
题目大意 有\(n\)个城镇被分成了\(k\)个郡,有\(m\)条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. 题目分析 每条边至少有一个端点是首都,每个郡至多 ...
随机推荐
- 将Model对象转换成json文本或者json二进制文件
将Model对象转换成json文本或者json二进制文件 https://github.com/casatwy/AnyJson 注意:经过测试,不能够直接处理字典或者数组 主要源码的注释 AJTran ...
- Oracle数据库运维:要对监听日志文件(listener.log)进行定期清理,如果不定期清理,会遇到下面一些麻烦
原文链接: http://www.lookdaima.com/WebForms/WebPages/Blanks/Pm/Docs/DocItemDetail.aspx?EmPreviewTypeV=2& ...
- JS DateTime 格式化
首先看我们在浏览器接收到的DateTime格式的数据: 如果没有在传输的时候把DateTime转成字符串的话,我们只需要在JS中加一段代码即可转换,代码如下: function ChangeDateF ...
- 各个系统Docker安装
Ubuntu 1.Ubuntu 14.04及以上版本 Ubuntu 14.04版本官方软件源已经自带了Docker包,可以直接安装: $ sudo apt-get update $ sudo apt- ...
- [EffectiveC++]item45:运用成员函数模板接受所有兼容类型
- 题解 P1894 【[USACO4.2]完美的牛栏The Perfect Stall】
题面 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们 ...
- #001 如何组织JS代码
如何组织JS代码 有没有这样的经历,在编写代码的时候,因为功能简单,写的时候比较随意,所有的JS代码都放在一个文件里面,但是随着功能的增加,发现代码很乱,不好维护. 简单的整理了一下,目前对已有项目的 ...
- 【ansible】Windows开启远程控制错误解决方案:无法检查防火墙状态
这个在老版本的Windows系统才有这种bug.例如Windows 2008 R2和Windows 7,如果你的系统的阿里云的Windows server 2008 R2,无需装这个,好像阿里云的系统 ...
- 学习python第三天单行函数
1.去重:distinct关键字 需求:查看公司一共有多少部门? select department_id from employees;此代码会查出107条记录,存在部门重复的问题! select ...
- Anaconda 安装和使用
最近看了些关于数据分析的书,想系统的整理下相关知识,算是学习笔记吧,也希望能帮到初学者. 1.Anaconda介绍 安装python的方法有很多种,数据分析方面比较常用Anaconda.Anacond ...