题意

\(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的更多相关文章

  1. 【BZOJ】3495: PA2010 Riddle 2-SAT算法

    [题意]有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都.n,m,k<=10^6. [算法]2-SAT,前后缀优化建图 [题解] ...

  2. 3495: PA2010 Riddle 2-sat 前缀优化

    3495: PA2010 Riddle 2-sat 前缀优化 链接 bzoj 思路 不想说啥了,看hwim的吧,我去睡觉了zZ. 代码 /******************************* ...

  3. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  4. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  5. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  6. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  7. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  8. 3495: PA2010 Riddle

    3495: PA2010 Riddle 链接 分析: 每个点要么建首都,要么不建,并且一个点建了,会导致一些点不能建.所以可以考虑2-sat. 但是如果在每个郡里两两连边,边数是n^2的. 考虑用前缀 ...

  9. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

随机推荐

  1. FreeCodeCamp练习笔记

    CSS样式表: 嵌套:body是最外层包围其他所有HTML元素(标签),其中的元素样式都可覆盖body的样式. 覆盖:同一元素有多个样式,位置靠后的样式覆盖位置靠前的样式. id:id与位置无关,可任 ...

  2. 什么时候用@Resource,什么时候用@service

    Spring中什么时候用@Resource,什么时候用@service当你需要定义某个类为一个bean,则在这个类的类名前一行使用@Service("XXX"),就相当于讲这个类定 ...

  3. codevs1021 玛丽卡

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  4. codevs2800 送外卖

    题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一 ...

  5. eclipse version

    查看Eclipse的版本号: 1. 找到eclipse安装目录 2. 进入readme文件夹,打开readme_eclipse.html 3. readme_eclipse.html呈现的第二行即数字 ...

  6. 代码质量管理工具 sonar 配置

    代码检查工具有很多findBugs等等 sonar配置: 1.下载sonar 5.5, 解压,运行 sonarqube-5.5\bin\windows-x86-64\StartSonar.bat , ...

  7. Linux下忘记MySQL的root密码的解决方法

    恢复方法之一 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也 ...

  8. PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)

    摘要 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的.而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞.利用PHP文件包含漏洞入侵网站也是主流的 ...

  9. BZOJ1264——[AHOI2006]基因匹配Match

    1.题意,求最长公共子序列,每个数字在序列中都出现5次 2.分析:最长公共子序列的标准解法是dp,$O(n^2)$过不了的,然后我们发现判断哪两个位置优化的地方用$5n$就可以搞定了,那么我们用BIT ...

  10. JavaScript访问ab页面定时跳转代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...