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


写在前面

不会吧不会吧,这么裸的2-SAT都看不出来? 经验题

题目传送门

Solution

2-SAT处理

关于什么是2-SAT,详见Oiwiki

简单来说,2-SAT问题的形式是给一堆条件,每个条件中有两个小条件,不过只需要满足其中一种

题目中说评委的两个条件只需要满足一个即可,然后每种材料又有满式和汉式两种选择

这不显然让我们打2-SAT?可能也有其他神仙做法

而2-SAT主要考察建图这一块,我们用 \(0 \sim n\) 表示满式,用 \(n+1 \sim 2n\) 表示汉式,用 \(x^{-1}\) 表示 \(x\) 的另一种菜式

那么对于任意一个条件 \((a_i,b_i)\)

  • 首先让我们满足 \(a_i\) 而不满足 \(b_i\) ,那就从 \(a_i\)\(b_i^{-1}\) 连一条边

  • 然后让我们满足 \(b_i\) 而不满足 \(a_i\) ,那就从 \(b_i\)\(a_i^{-1}\) 连一条边

(别搞混了调半天)

字符串处理

暴力处理即可,判断第一个字符确定满式还是汉式

扫一遍字符串取出是第几号菜,然后按上面的方式加边

答案判断

用强连通分量缩点

缩点后,如果存在同一菜品出现在同一强联通分量里,那就不能满足

否则就可以满足

大体思路就这些,看代码吧

Code

/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
*/
#include
#include
#include
#include
#define LL long long
#define orz cout<<"lkp AK IOI!"<>(u + 1)>>(v + 1);
//			cout<<(u + 1)<<" "<<(v + 1)<

如果有什么问题,请在评论区指正