当前位置: 首页 > news >正文

P4171 [JSOI2010] 满汉全席

P4171 [JSOI2010] 满汉全席

大意

要求判断是否满足多对需求。

思路

显然,对于每个评委,他的两个要求你至少要完成一个菜,那么我们显然就有这样的连边:

定义 \(u \times 2\) 表示 \(u\) 这个点采用汉式做法,\(u \times 2 + 1\) 表示这个点采用满式做法。

那么对于我们给的两个玩意就可以分成 \(4\) 种情况讨论:

\[\begin{cases} \begin{cases} u \times 2 \to v \times 2, \\ v \times 2 + 1 \to u \times 2 + 1 \end{cases} & u = \text{'m'} \land v = \text{'h'}, \\ \begin{cases} u \times 2 \to v \times 2 + 1, \\ v \times 2 \to u \times 2 + 1 \end{cases} & u = \text{'m'} \land v = \text{'m'}, \\ \begin{cases} u \times 2 + 1 \to v \times 2, \\ v \times 2 + 1 \to u \times 2 \end{cases} & u = \text{'h'} \land v = \text{'h'}, \\ \begin{cases} u \times 2 + 1 \to v \times 2 + 1, \\ v \times 2 \to u \times 2 \end{cases} & u = \text{'h'} \land v = \text{'m'} \end{cases} \]

然后就直接正常跑 \(\text{2 - SAT}\) 即可。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 200;
int n, m, S[N * 2], c;
bool selected[N * 2];
vector<int> g[N * 2];
bool dfs(int u) {if (selected[u ^ 1]) {return false;}if (selected[u]) {return true;}selected[u] = true;S[c++] = u;for (int i = 0; i < g[u].size(); i++) {int v = g[u][i];if (!dfs(v)) {return false;}}return true;
}
bool Two_SAT() {for (int i = 0; i < 2 * n; i += 2) {if (!selected[i] && !selected[i + 1]) {c = 0;if (!dfs(i)) {while (c > 0) {selected[S[--c]] = false;}if (!dfs(i + 1)) {return false;}}}}return true;
}
int main() {int T, u, v;cin >> T;while (T--) {cin >> n >> m;for (int i = 0; i < n * 2; i++) {g[i].clear();}memset(selected, 0, sizeof(selected));for (int i = 1; i <= m; i++) {char o1, o2;cin >> o1 >> u >> o2 >> v;u--, v--;if (o1 == 'm') {if (o2 == 'h') {g[u * 2].push_back(v * 2);g[v * 2 + 1].push_back(u * 2 + 1);} else if (o2 == 'm') {g[u * 2].push_back(v * 2 + 1);g[v * 2].push_back(u * 2 + 1);}} else if (o1 == 'h') {if (o2 == 'h') {g[u * 2 + 1].push_back(v * 2);g[v * 2 + 1].push_back(u * 2);} else if (o2 == 'm') {g[u * 2 + 1].push_back(v * 2 + 1);g[v * 2].push_back(u * 2);}}}if (Two_SAT()) {cout << "GOOD" << endl;} else {cout << "BAD" << endl;}}return 0;
}
http://www.jsqmd.com/news/111431/

相关文章:

  • dotnet未捕获异常导致系统崩溃问题
  • Scikit-Learn 1.8引入 Array API,支持 PyTorch 与 CuPy 张量的原生 GPU 加速
  • Day33PC与移动端的适配方案简介
  • 无代码解决方案:解锁数字化转型的普惠路径
  • 【Agent】MemOS 源码笔记---(6)---MemScheduler -- 总体
  • 震惊!IF9.8,中科院1区TOP或被SCI剔除!官网已“消失”......
  • 杂乱的一些note
  • 21、Samba使用与故障排查全解析
  • C++输入输出(cin和cout)的用法
  • 深入理解Golang并发模型与CSP理论
  • Oracle索引技术:理论与实操全解析
  • 23、Samba使用与SSL配置全解析
  • 三菱PLC与组态王打造饮料自动装箱机控制系统
  • 【Nature Communications‘24‘06】预训练多模态大语言模型经过 SkinGPT-4 提升皮肤病学诊断能力
  • 品牌营销战略策划公司选哪家靠谱?奇正沐古 - 资讯焦点
  • 100 天学会爬虫 · Day 12:为什么要给爬虫加随机 User-Agent?原理与实战
  • 宪法守护童年:向霸凌和诈骗说“不” - 资讯焦点
  • 2025年郑州头部吊顶式空调机组设计多少钱,空气幕/表冷器/卧式暗装风机盘管/吊顶式空调机组/工业暖风机吊顶式空调机组采购找哪家 - 品牌推荐师
  • RUI Builder-图形化UI设计-工程范例
  • argocd-案例
  • 探秘新能源整车动力性经济性仿真模型:精确模拟驱动未来出行
  • 人工智能如何改变 Anthropic 的工作方式
  • 从孤岛到桥梁:我的个人知识管理进化史
  • Pitch:上下点头(俯仰) Yaw:左右转向(偏航) Roll:侧身翻滚(倾斜)
  • 谢飞机的面试之旅:如何在互联网大厂面试中脱颖而出
  • 100G双光口网卡技术解析:Intel E810-CAM2方案的性能与应用突破
  • USB挂起(Suspend)和远程唤醒(Remote Wakeup)之间的关系
  • 2025年天津热门的消防排烟风机批发哪家好,工业暖风机/卧式暗装风机盘管/卡式风机盘管/直膨式空调机组/吊顶式空调机组消防排烟风机设计排行榜 - 品牌推荐师
  • 英语_阅读_What can stand for China_待读
  • WinAPI 极简教程:超便捷的 Windows 接口入门