2-SAT。

建立n个变量,其中第i个变量表示第i个城市是否是首都。

对于边(x,y),连边x->y',y->x'。

对于一个有y个城市的国家,新建2y个变量,分别表示前i个城市和后i个城市中是否有首都。

然后求出SCC,判断是否存在合法的方案即可,时间复杂度$O(n+m)$。

#include<cstdio>
const int N=1000010,M=6000010;
int n,m,k,i,x,y,tot,f[N][2],pre[N][2],suf[N][2],q[M],t,from[M];bool v[M];
struct E{int v;E*nxt;}*g[M],*h[M],pool[N*24],*cur=pool,*p;
inline void add(int x,int y){p=cur++;p->v=y;p->nxt=g[x];g[x]=p;p=cur++;p->v=x;p->nxt=h[y];h[y]=p;
}
void dfs1(int x){v[x]=1;for(E*p=g[x];p;p=p->nxt)if(!v[p->v])dfs1(p->v);q[++t]=x;
}
void dfs2(int x,int y){v[x]=0,from[x]=y;for(E*p=h[x];p;p=p->nxt)if(v[p->v])dfs2(p->v,y);
}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
int main(){read(n),read(m),read(k);for(i=1;i<=n;i++)f[i][0]=++tot,f[i][1]=++tot;while(m--)read(x),read(y),add(f[x][0],f[y][1]),add(f[y][0],f[x][1]);while(k--){read(y);for(i=1;i<=y;i++){pre[i][0]=++tot,pre[i][1]=++tot;suf[i][0]=++tot,suf[i][1]=++tot;read(x);add(f[x][1],pre[i][1]);add(f[x][1],suf[i][1]);add(pre[i][0],f[x][0]);add(suf[i][0],f[x][0]);}for(i=2;i<=y;i++){add(pre[i-1][1],pre[i][1]);add(pre[i-1][1],suf[i][0]);add(pre[i-1][0],suf[i][1]);add(suf[i][1],suf[i-1][1]);add(suf[i][1],pre[i-1][0]);add(suf[i][0],pre[i-1][1]);}}for(i=1;i<=tot;i++)if(!v[i])dfs1(i);for(i=tot;i;i--)if(v[q[i]])dfs2(q[i],q[i]);for(i=1;i<n;i+=2)if(from[i]==from[i+1])return puts("NIE"),0;return puts("TAK"),0;
}

  

转载于:https://www.cnblogs.com/clrs97/p/4639081.html

BZOJ3495 : PA2010 Riddle相关推荐

  1. BZOJ3495 PA2010 Riddle 【2-sat】

    题目链接 BZOJ3495 题解 每个城市都有选和不选两种情况,很容易考虑到2-sat 边的限制就很好设置了,主要是每个郡只有一个首都的限制 我们不可能两两之间连边,这样复杂度就爆炸了 于是乎就有了一 ...

  2. P6378 [PA2010] Riddle(2-sat/前后缀优化建图)

    P6378 [PA2010] Riddle n个点m条边的无向图,分为k个部分,从每个部分选择恰好一个关键点,使得每条边至少有一个端点是关键点. 首先有这么多的限制,实际上就是一个选或者不选的问题,每 ...

  3. bzoj 3495: PA2010 Riddle(2-SAT)

    3495: PA2010 Riddle Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 327  Solved: 115 [Submit][Statu ...

  4. 【bzoj 3495】PA2010 Riddle

    Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. Input 第一行有三个整数,城镇数n(1<=n&l ...

  5. P6378 [PA2010] Riddle 2-sat + 前缀和优化建图

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点mmm调变的无向图被分成kkk个部分,每个部分包含若干点,请选择一些关键点,使得每个部分恰好有一个关键点,且每条边至少有一个是关键点. 1≤k, ...

  6. BZOJ.3495.[PA2010]Riddle(2-SAT 前缀优化建图)

    题目链接 每个城市要么建首都要么不建,考虑2-SAT 这样一个国家内城市两两连边是很显然的,但是边数为O(n^2) 每个国家中仅有一个建首都,考虑新建前缀S[i]=1/0这2n个点表示当前国家的[1, ...

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

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

  8. linux逻辑卷下空间丢了,Linux-lvm逻辑卷管理和提示丢失pv物理卷

    问题描述: 有次在使用lvm扩容的时候,整错了,导致显示如下情况 提示缺少一个pv导致无法继续,pvdisplay的时候查看到unknown 使用pvs查看找到pvname的unknown对应群组ce ...

  9. 做题记录 To 2019.2.13

    2019-01-18 4543: [POI2014]Hotel加强版:长链剖分+树形dp. 3653: 谈笑风生:dfs序+主席树. POJ 3678 Katu Puzzle:2-sat问题,给n个变 ...

  10. 网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 本文讲描述, 如何在网页端实现一个仿微信 ...

最新文章

  1. 【c语言】求n个整数的和
  2. 【学术相关】研究生第一篇学术论文常犯问题总结
  3. C++ COM编程之接口背后的虚函数表
  4. 第六节:用audio标签打造一个属于自己的HTML5音乐播放器
  5. 1.3编程基础之算术表达式与顺序执行 06 甲流疫情死亡率
  6. java secondtotime_Java中的LocalTime toSecondOfDay()方法
  7. 数据库和缓存一致性分析
  8. mysql innobackupex 备份及恢复
  9. AD(十九)class、设计参数、规则的创建
  10. vscode英文感叹号没出现提示文本解决方法
  11. 食品级L-天门冬氨酸市场现状及未来发展趋势
  12. 区块链应用 | 高盛报告深度解读:区块链在未来的5大应用
  13. Promise基础知识
  14. 安全检查监理项目部材料清单
  15. android 根目录缓存,Android 文件目录存储介绍 缓存目录 | 私有目录 | 系统根目录 | 用户可见目录...
  16. excel查找并返回多行数据
  17. 搞笑决战水源之巅收藏六 师傅
  18. C++对接国际验证码接口DEMO示例
  19. Weblogic错误总结
  20. 毕业两年,一年工作经验,一个月拿下腾讯T4 offer

热门文章

  1. 0 post 报红_【报Bug】升级2.3.0.20190919 后,原正常的request post 全部报 Status Code: 415 Unsupported Media Type...
  2. python cprofile_Python Profilers 分析器
  3. python如何实现单例模式_用Python实现设计模式——单例模式
  4. java匿名内部类 内部类_java中的匿名内部类详细总结
  5. controlleradvice 参数_Spring mvc中@ModelAttribute和@ControllerAdvice使用
  6. 阿里云云计算 27 在线实验--SLB初体验
  7. 极客大学架构师训练营 网络通信协议 非阻塞网络I/O NIO 数据库架构原理 第16课 听课总结
  8. 算法:Majority Element(求众数)
  9. 数据操作(基于MXNET框架)
  10. this conn php,测试connect.php文件出现问题