~bzoj1823

第一次接触2-SAT——SAT,即适定性(Satisfiability)的缩写。像名称所说,即满足需求的可能性问题,而k-SAT即每个人有k种需求,已经证明k>2时是一个NP完全问题。所以现在常见的考法便是2-SAT。

这一道题目算是一道裸的2-SAT问题。每一个人有两种需求,那么我们就将每一种食物拆成两个点,一个代表m,一个代表h,可以注意到满足所有人的需求即如果满足不了其中一个,必须满足另一个,所以我们建图的方法为从无法满足要求的点连向必须满足的点,代表若一个点不符合要求,必然走向后续的决策。那么问题的答案相比到这里已经比较明了了。我们就应当在这张图上求出强连通分量,看是否有一个点的两个拆点都存在于同一个强连通分量上。若是如此,就说明无法满足要求。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define maxn 100000
  4. int T, cnt, cnp = , n, m, low[maxn], dfn[maxn], num[maxn], timer, head[maxn];
  5. bool flag, mark[maxn], vis[maxn];
  6. stack <int> st;
  7. struct edge
  8. {
  9. int to, last;
  10. }E[maxn];
  11.  
  12. int read()
  13. {
  14. int x = ;
  15. char c;
  16. c = getchar();
  17. while(c < '' || c > '') c = getchar();
  18. while(c >= '' && c <= '') x = x * + c - '', c = getchar();
  19. return x;
  20. }
  21.  
  22. void add(int u, int v)
  23. {
  24. E[cnp].to = v, E[cnp].last = head[u], head[u] = cnp ++;
  25. }
  26.  
  27. void tarjan(int u)
  28. {
  29. dfn[u] = low[u] = ++ timer;
  30. vis[u] = true, mark[u] = true;
  31. st.push(u);
  32. for(int i = head[u]; i; i = E[i].last)
  33. {
  34. int v = E[i].to;
  35. if(vis[v])
  36.   { if(mark[v] && low[u] > dfn[v]) low[u] = dfn[v]; }
  37. else
  38. {
  39. tarjan(v);
  40. low[u] = min(low[u], low[v]);
  41. }
  42. }
  43. if(dfn[u] == low[u])
  44. {
  45. ++ cnt;
  46. int j;
  47. do
  48. {
  49. j = st.top();
  50. st.pop();
  51. mark[j] = false;
  52. num[j] = cnt;
  53. }while(!st.empty() && j != u);
  54. }
  55. }
  56.  
  57. void init()
  58. {
  59. memset(vis, , sizeof(vis));
  60. memset(head, , sizeof(head));
  61. cnp = , timer = ;
  62. flag = false;
  63. }
  64.  
  65. int main()
  66. {
  67. T = read();
  68. while(T --)
  69. {
  70. n = read(), m = read();
  71. init();
  72. for(int i = ; i <= m; i ++)
  73. {
  74. char c1, c2;
  75. int d1, d2;
  76. cin >> c1 >> d1 >> c2 >> d2;
  77. int a = , b = ;
  78. a += (c1 == 'h'), b += (c2 == 'h');
  79. add((( * d2) + b) ^ , ( * d1) + a);
  80. add((( * d1) + a) ^ , * d2 + b);
  81. }
  82. for(int i = ; i <= * n + ; i ++)
  83. if(!vis[i]) tarjan(i);
  84. for(int i = ; i <= * n; i += )
  85. if(num[i] == num[i ^ ])
  86. {
  87. printf("BAD\n");
  88. flag = true; break;
  89. }
  90. if(!flag) printf("GOOD\n");
  91. }
  92. return ;
  93. }

【题解】JSOI2010满汉全席的更多相关文章

  1. 【BZOJ1823】[JSOI2010]满汉全席(2-sat)

    [BZOJ1823][JSOI2010]满汉全席(2-sat) 题面 BZOJ 洛谷 题解 很明显的\(2-sat\)模板题,还不需要输出方案. 对于任意两组限制之间,检查有无同一种石材要用两种不同的 ...

  2. 【BZOJ1823】[JSOI2010]满汉全席 2-SAT

    [BZOJ1823][JSOI2010]满汉全席 Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只 ...

  3. bzoj1823 [JSOI2010]满汉全席(2-SAT)

    1823: [JSOI2010]满汉全席 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1246  Solved: 598[Submit][Status ...

  4. BZOJ 1823: [JSOI2010]满汉全席( 2-sat )

    2-sat...假如一个评委喜好的2样中..其中一样没做, 那另一样就一定要做, 这样去建图..然后跑tarjan. 时间复杂度O((n+m)*K) ------------------------- ...

  5. BZOJ_1823_[JSOI2010]满汉全席_2-sat+tarjan

    BZOJ_1823_[JSOI2010]满汉全席_2-sat 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1823 分析:一道比较容易看出来的 ...

  6. 洛谷 P4171 [JSOI2010]满汉全席 解题报告

    P4171 [JSOI2010]满汉全席 题目描述 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高 ...

  7. 题解 JSOI2010 找零钱的洁癖

    题解 JSOI2010 找零钱的洁癖 题面 BZOJ 个人体会 van全没有思路... 只能去看题解... 还是个bfs+贪心 不管怎样竟然乱搞过了... 听M_sea小姐姐说她有更正经的做法(线性规 ...

  8. BZOJ1823:[JSOI2010]满汉全席——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1823 https://www.luogu.org/problemnew/show/P4171 题面 ...

  9. 题解 P4171 【[JSOI2010]满汉全席】

    什么,tarjan?那是什么? 码量太大,我选择放弃 为什么不用dfs写2-sat呢?他会伤心的说 这题2-sat的过程大佬们已经讲得非常清楚了,我就略微提一下,主要讲dfs的原理 2_sat原理 我 ...

随机推荐

  1. Excel VBA表格自行开发计划

    Excel VBA表格自行开发计划 要求功能 1. 批量删除 2. [X] 批量填充 3. [X] 批量重命名 4. [ ] 按颜色求和 5. [ ] 按底纹色选中单元格 6. [ ] 统计底纹颜色个 ...

  2. python 排列组合

    笛卡尔积(product): 假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2) ...

  3. ruby 数据类型Range

    范围(Range)无处不在:a 到 z. 0 到 9.等等.Ruby 支持范围,并允许我们以不同的方式使用范围: 作为序列的范围 作为条件的范围 作为间隔的范围 作为序列的范围 (1..5) #==& ...

  4. Git使用之一:创建仓储和提交文件

    一.前期工作:   1.准备自己的文件夹用于同步文件   2.准备自己的Git账号,并设置好项目(推荐使用国产的码云)   3.安装Git软件 (下载地址: 32-bit Git for Window ...

  5. elasticsearch 关联查询

    父-子关系文档 父-子关系文档 在实质上类似于 nested model :允许将一个对象实体和另外一个对象实体关联起来. 而这两种类型的主要区别是:在 nested objects 文档中,所有对象 ...

  6. guacamole实现上传下载

    目录 1. 源码解读 2. 上传下载的核心代码 分析的入手点,查看websocket连接的frame 看到首先服务端向客户端发送了filesystem请求,紧接着浏览器向服务端发送了get请求,并且后 ...

  7. 【PHP】进一法取整、四舍五入取整、忽略小数等的取整数方法大全

    PHP取整数函数常用的四种方法,下面收集了四个函数:经常用到取整的函数,今天小小的总结一下!其实很简单,就是几个函数而已--主要是:ceil,floor,round,intval PHP取整数函数常用 ...

  8. c#一些常用的方法集合

    是从一个asp.net mvc的项目里看到的.挺实用的. 通过身份证号码获取出生日期和性别 通过身份证号码获取出生日期和性别 #region 由身份证获得出生日期 public static stri ...

  9. 「学习记录」《数值分析》第三章计算实习题(Python语言)

    第三题暂缺,之后补充. import matplotlib.pyplot as plt import numpy as np import scipy.optimize as so import sy ...

  10. ubuntu12.04停留在grub界面问题

    修改ubuntu 12.04 停留在grub界面的步骤: 1. 在/etc/default/grub配置文件中, 添加一项GRUB_RECORDFAIL_TIMEOUT: GRUB_TIMEOUT=2 ...