题意

\(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一下,很简单的。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=1000005*6, M=1000005*12;
  4. int ihead[N], cnt, FF[N], LL[N], p[N], scc, tot;
  5. struct E {
  6. int next, to;
  7. }e[M];
  8. void add(int x, int y) {
  9. e[++cnt]=(E){ihead[x], y}; ihead[x]=cnt;
  10. }
  11. void dfs(int x) {
  12. static int tid=0, s[N], vis[N], top=0;
  13. s[++top]=x;
  14. vis[x]=1;
  15. FF[x]=LL[x]=++tid;
  16. for(int i=ihead[x]; i; i=e[i].next) {
  17. int y=e[i].to;
  18. if(!FF[y]) {
  19. dfs(y);
  20. LL[x]=min(LL[x], LL[y]);
  21. }
  22. else if(vis[y]) {
  23. LL[x]=min(LL[x], FF[y]);
  24. }
  25. }
  26. if(FF[x]==LL[x]) {
  27. ++scc;
  28. int y;
  29. do {
  30. y=s[top--];
  31. vis[y]=0;
  32. p[y]=scc;
  33. } while(x!=y);
  34. }
  35. }
  36. bool check() {
  37. for(int i=1, all=tot<<1|1; i<=all; ++i) {
  38. if(!FF[i]) {
  39. dfs(i);
  40. }
  41. }
  42. for(int i=1; i<=tot; ++i) {
  43. if(p[i<<1]==p[i<<1|1]) {
  44. return 0;
  45. }
  46. }
  47. return 1;
  48. }
  49. int main() {
  50. int n, m, k;
  51. scanf("%d%d%d", &n, &m, &k);
  52. for(int i=1; i<=m; ++i) {
  53. int x, y;
  54. scanf("%d%d", &x, &y);
  55. add(x<<1|1, y<<1);
  56. add(y<<1|1, x<<1);
  57. }
  58. tot=n;
  59. for(int j=1; j<=k; ++j) {
  60. scanf("%d", &m);
  61. for(int i=1; i<=m; ++i) {
  62. int a;
  63. scanf("%d", &a);
  64. int now=tot+i;
  65. if(i!=1) {
  66. add(now<<1|1, (now-1)<<1|1);
  67. add((now-1)<<1, now<<1);
  68. add(a<<1, (now-1)<<1|1);
  69. }
  70. else {
  71. add(a<<1|1, now<<1|1);
  72. }
  73. add(now<<1|1, a<<1|1);
  74. add(a<<1, now<<1);
  75. now=tot+m+i;
  76. if(i!=m) {
  77. add(now<<1|1, (now+1)<<1|1);
  78. add((now+1)<<1, now<<1);
  79. add(a<<1, (now+1)<<1|1);
  80. }
  81. else {
  82. add(a<<1|1, now<<1|1);
  83. }
  84. add(now<<1|1, a<<1|1);
  85. add(a<<1, now<<1);
  86. }
  87. tot+=2*m;
  88. }
  89. puts(check()?"TAK":"NIE");
  90. return 0;
  91. }

【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. 【09-23】js原型继承学习笔记

    js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...

  2. 2015.4.19 为什么footer下a的索引值那么大

    1.问题demo:为什么footer下a的索引值那么大,index不是查找兄弟级别的元素么?而且还限定了范围在footer下的a的情况下. 解决方法:alert( $("#footer a& ...

  3. hzwer模拟赛 虫洞

    [题目描述] N个虫洞,M条单向跃迁路径.从一个虫洞沿跃迁路径到另一个虫洞需要消耗一定量的燃料和1单位时间.虫洞有白洞和黑洞之分.设一条跃迁路径两端的虫洞质量差为delta. 1.从白洞跃迁到黑洞,消 ...

  4. ViewHolder的改进写法

    先看看ViewHolder通用写法         ViewHolder holder = null;         if(convertView == null){                 ...

  5. Effective Java Second Edition --- Builder Pattern

    如果类的构造器或者静态工厂中有多个参数,设计这种类时,Builder模式是一种不错的选择,特别是当大多数参数是可选的时候. 与使用传统的重载构造函数模式相比,使用Builder模式的客户端代码更易于阅 ...

  6. jQuery入门(3)事件与事件对象

    jQuery入门(1)jQuery中万能的选择器 jQuery入门(2)使用jQuery操作元素的属性与样式 jQuery入门(3)事件与事件对象 jQuery入门(4)jQuery中的Ajax()应 ...

  7. ajax请求webservice的过程中遇到的问题总结

    前台用ajax的post方法,无法请求到webservice中的方法的时候,需要在配置文件中添加 web.config文件中的 <system.web> 节点下加入:<webServ ...

  8. webview滑动事件 与内部html左右滑动事件冲突问题的解决办法

    最近在做个混合app , 用html做页面,然后通过webview嵌套在activity中,效果是这样: 开始还是比较顺利,增加了菜单退出按钮,返回键页面回退功能,页面加载显示加载图标(在app端实现 ...

  9. git 简单使用

    创建新分支:git branch branchName 切换到新分支:git checkout branchName 然后 ,上面两个命令也可以合成为一个命令: git checkout -b bra ...

  10. MYSQL(二)

    上一篇文章讲的是mysql的基本操作,这一篇会有一点难以理解,本节主要内容mysql视图,存储过程,函数,事务,触发器,以及动态执行sql 视图view 视图是一个虚拟表,其内容由查询定义.同真实的表 ...