考虑\(2-SAT\)。

将汉式看作\(0\)状态,满式看做\(1\)状态,将每个材料拆成\(01\)两个状态。

从\(a\)向\(b\)连有向边表示的意义为选了\(a\)后必须选\(b\)。

那么每次连边的方式如下:

\(add(x_{a \oplus 1},y_b),add(y_{b \oplus 1},x_a)\)(\(x_a\)和\(y_b\)为评审员的要求,\(x\)和\(y\)表示材料,\(a\)和\(b\)表示状态)

意义为若没有满足评审员的其中一个要求,则另一个要求必须满足。

连边后缩点,若发现\(x_a\)和\(x_{a \oplus 1}\)在同一强连通分量中,则无解。

其他的一些实现的处理,就看代码吧。

\(code:\)

  1. #include<bits/stdc++.h>
  2. #define maxn 4000010
  3. using namespace std;
  4. template<typename T> inline void read(T &x)
  5. {
  6. x=0;char c=getchar();bool flag=false;
  7. while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
  8. while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
  9. if(flag)x=-x;
  10. }
  11. int t,n,m;
  12. char str[5];
  13. struct edge
  14. {
  15. int to,nxt;
  16. }e[maxn];
  17. int head[maxn],edge_cnt;
  18. void add(int from,int to)
  19. {
  20. e[++edge_cnt]=(edge){to,head[from]};
  21. head[from]=edge_cnt;
  22. }
  23. int dfn_cnt,co_cnt,top;
  24. int dfn[maxn],low[maxn],co[maxn],st[maxn];
  25. bool vis[maxn];
  26. void tarjan(int x)
  27. {
  28. dfn[x]=low[x]=++dfn_cnt;
  29. st[++top]=x;
  30. vis[x]=true;
  31. for(int i=head[x];i;i=e[i].nxt)
  32. {
  33. int y=e[i].to;
  34. if(!dfn[y])
  35. {
  36. tarjan(y);;
  37. low[x]=min(low[x],low[y]);
  38. }
  39. else if(vis[y])
  40. low[x]=min(low[x],dfn[y]);
  41. }
  42. if(low[x]==dfn[x])
  43. {
  44. co_cnt++;
  45. int now;
  46. do
  47. {
  48. now=st[top--];
  49. vis[now]=false;
  50. co[now]=co_cnt;
  51. }while(now!=x);
  52. }
  53. }
  54. bool check()
  55. {
  56. for(int i=1;i<=2*n;++i)
  57. if(!dfn[i])
  58. tarjan(i);
  59. for(int i=1;i<=n;++i)
  60. if(co[i]==co[i+n])
  61. return false;
  62. return true;
  63. }
  64. void clear()
  65. {
  66. top=dfn_cnt=co_cnt=edge_cnt=0;
  67. memset(co,0,sizeof(co));
  68. memset(dfn,0,sizeof(dfn));
  69. memset(low,0,sizeof(low));
  70. memset(vis,0,sizeof(vis));
  71. memset(head,0,sizeof(head));
  72. }
  73. int main()
  74. {
  75. read(t);
  76. while(t--)
  77. {
  78. clear();
  79. read(n),read(m);
  80. while(m--)
  81. {
  82. int x,y,a,b,len;
  83. scanf("%s",str);
  84. if(str[0]=='h') a=0;
  85. else a=1;
  86. x=0,len=strlen(str);
  87. for(int i=1;i<len;++i) x=x*10+str[i]-'0';
  88. scanf("%s",str);
  89. if(str[0]=='h') b=0;
  90. else b=1;
  91. y=0,len=strlen(str);
  92. for(int i=1;i<len;++i) y=y*10+str[i]-'0';
  93. add(x+(a^1)*n,y+b*n),add(y+(b^1)*n,x+a*n);
  94. }
  95. if(check()) puts("GOOD");
  96. else puts("BAD");
  97. }
  98. return 0;
  99. }

题解 洛谷 P4171 【[JSOI2010]满汉全席】的更多相关文章

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

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

  2. 洛谷P4171 [JSOI2010] 满汉全席 [2-SAT,Tarjan]

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

  3. [洛谷P4171][JSOI2010]满汉全席

    题目大意:有$n$个点,每个点可以选或不选,有$m$组约束,形如$a,u,b,v$,表示$u=a,v=b$中至少要满足一个条件,问是否存在一组解,多组询问 题解:$2-SAT$,感觉是板子题呀,最后判 ...

  4. 洛谷 P4171 [JSOI]满汉全席

    洛谷 最近刚刚学的2-sat,就刷了这道裸题. 2-sat问题一般是用tarjan求的,当出现(x,y)或(!x,y)或(x,!y)三种选择时,我们可以把!x->y,!y->x连边. 然后 ...

  5. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  6. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  7. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

  8. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  9. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

随机推荐

  1. 10、一个action中处理多个方法的调用第二种方法method的方式

    在实际的项目中,经常采用现在的第二种方式在struct.xml中采用清单文件的方式 我们首先来看action package com.bjpowernode.struts2; import com.o ...

  2. druid18.1版本sing-server启动报错

    正文 昨天下载了一个18版本的driud打算在虚拟机探究一下,然后按照官网的启动方式启动了,每个失败.官网是/bin/start-micro-quickstart,我们去看他的单机启动配置 http: ...

  3. express高效入门教程(2)

    2.请求和响应 2.1.请求相关 2.1.1.返回一个html页面 // 注意path模块需要先引入 app.get('/', function (req, res){ res.sendFile(pa ...

  4. node+ajax实战案例(5)

    6.添加客户 6.1.点击添加按钮,弹出表单框 // 添加用户 显示对话框 var addBtn = document.getElementById('add-btn'); var addUser = ...

  5. DOM-BOM-EVENT(6)

    6.BOM 6.1.什么是BOM? BOM(Browse Object Model),浏览器对象模型,没有相关标准,是约定俗成的东西,定义了一些操作浏览器的方法和属性,大部分方法都是通过window对 ...

  6. 文档翻译经验分享(Markdown)

    该教程基于VSCode 加一些插件 youdao translate https://marketplace.visualstudio.com/items?itemName=Yao-Translate ...

  7. 面向切面对象AOP

    前言 面向切面编程(思想)AOP Aspect Oriented  Programming,是面向对象基础上 更关注最终目标 而不关注中间的小目标,简而言之,就是我们的目标(例如constroller ...

  8. 基于ASP.NET core的MVC站点开发笔记 0x01

    基于ASP.NET core的MVC站点开发笔记 0x01 我的环境 OS type:mac Software:vscode Dotnet core version:2.0/3.1 dotnet sd ...

  9. 3W字干货深入分析基于Micrometer和Prometheus实现度量和监控的方案

    前提 最近线上的项目使用了spring-actuator做度量统计收集,使用Prometheus进行数据收集,Grafana进行数据展示,用于监控生成环境机器的性能指标和业务数据指标.一般,我们叫这样 ...

  10. Python and or not 优先级

    not > and >or 1 or 5 and 4: -> 1 or 4-> 1 (1 or 5) and 4: ->1 and 4 ->4 x or y . x ...