感觉方法和题解差不多,但是题解写的好烦啊...也不是烦,就是很复杂

这里建议开一个数组表示当前这个点选或者不选的编号,这样之后自己理思路也会清楚一点

然而我调了一个小时才发现我是Tarjan写错了......

这道题对于每一个菜分两种情况讨论,每一种情况又有选和不选两种方案

所以相当于每一个菜可以拆成4个点

  1.做法M-选

  2.做法M-不选

  3.做法H-选

  4.做法H-不选

显然题目里给的条件是或,但是不只是有题目里给的条件,还有隐含条件:一道菜只能有一种做法!

然后按照2-sat的套路就好了

代码里$bb[i][j][k]$数组表示当前是第i道菜,做法是j:1/2,选或者不选是k:0/1

这样之后加边的时候会很简洁明了

 #include<bits/stdc++.h>
#define writeln(x) write(x),puts("")
#define writep(x) write(x),putchar(' ')
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}const int M = 2e4+;
int head[M],nxt[M],ver[M],tot,T,n,m,bb[M][][],dfn[M],low[M],ins[M],sta[M],top,color,col[M];
char s1[M],s2[M];
struct Judge{int type[],x[];}J[M];
inline void add(int x,int y){ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;}
void Tarjan(int x){
dfn[x]=low[x]=++T;ins[x]=;sta[top++]=x;
for(int i=head[x];i;i=nxt[i]){
if(!dfn[ver[i]])Tarjan(ver[i]),low[x]=min(low[x],low[ver[i]]);
else if(ins[ver[i]]==) low[x]=min(low[x],dfn[ver[i]]);
}if(low[x]==dfn[x]){++color;
do{ col[sta[--top]]=color;
ins[sta[top]]=-;
}while(sta[top]!=x);
}return;
}inline void Init(){
memset(low,,sizeof(low)),memset(dfn,,sizeof(dfn)),memset(ins,,sizeof(ins));
memset(col,,sizeof(col)),memset(head,,sizeof(head));tot=T=color=;
n=read(),m=read();
for(int i=;i<=m;i++){
scanf("%s%s",s1,s2);
int l1=strlen(s1),l2=strlen(s2);
if(s1[]=='m')J[i].type[]=;else J[i].type[]=;
if(s2[]=='m')J[i].type[]=;else J[i].type[]=;
int p=,ans=;
while(isdigit(s1[p])&&p<=l1){ans=(ans<<)+(ans<<)+s1[p]-;++p;}
J[i].x[]=ans;p=,ans=;
while(isdigit(s2[p])&&p<=l2){ans=(ans<<)+(ans<<)+s2[p]-;++p;}
J[i].x[]=ans;
}return;
}inline void Make_Graph(){
for(int i=;i<=n;i++)bb[i][][]=i,bb[i][][]=n+i,bb[i][][]=*n+i,bb[i][][]=*n+i;
for(int i=;i<=m;i++){
int x=J[i].type[],a=J[i].x[],y=J[i].type[],b=J[i].x[];
add(bb[a][x][],bb[b][y][]),add(bb[b][y][],bb[a][x][]);
add(bb[i][][],bb[i][][]),add(bb[i][][],bb[i][][]);
}
}inline void Solve(){
for(int i=;i<=n*;i++)if(!dfn[i])Tarjan(i);
for(int i=;i<=n;i++)if(col[bb[i][][]]==col[bb[i][][]]||col[bb[i][][]]==col[bb[i][][]])return puts("BAD"),void();
puts("GOOD");
}int main(){
int T=read();
while(T--)Init(),Make_Graph(),Solve();
return ;
}

【2-SAT】[JSOI2010]满汉全席的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. Bzoj1823 [JSOI2010]满汉全席

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1640  Solved: 798 Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的 ...

  8. 【BZOJ1823】 [JSOI2010]满汉全席

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

  9. BZOJ1823[JSOI2010]满汉全席——2-SAT+tarjan缩点

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

  10. 【刷题】BZOJ 1823 [JSOI2010]满汉全席

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

随机推荐

  1. java-day25

    . 标签学习:         1. 文件标签:构成html最基本的标签             * html:html文档的根标签             * head:头标签.用于指定html文档 ...

  2. 从模块到python文件的两种用法

    01模块的四种形式 模块 就是从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名是test.py的话,它的对应模块名就是test) 包 用 ...

  3. 文件IO 例子

    例子1: 测试最多打开多少个文件 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> # ...

  4. BeanUtils.copyProperties用法

    spring的BeanUtils.copyProperties用法 原创 2010年06月03日 13:43:00 标签: spring / struts / 数据库 / 工具 / action 一. ...

  5. Python全栈开发:Javascript

    JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一.如何编写 1.J ...

  6. (PASS)什么是原子性和原子性操作?

    什么是原子性操作呢? 下面我举一个例子来说明一下: A想要从自己的帐户中转1000块钱到B的帐户里.那么从A开始转帐,到转帐结束的这一个过程,称之为一个事务.在这个事务里,要做如下操作: 1. 从A的 ...

  7. leetcode-数组的相对排序

    Python解法: def relativeSortArray(arr1, arr2): arr = [0 for _ in range(110)] new = [] for a in range(l ...

  8. leetcode-263-丑数一

    题目描述: 方法一:递归 class Solution: def isUgly(self, num: int) -> bool: if num == 0: return False if num ...

  9. 记录一下webpack好用的node模块

    postcss-loader autoprefixer: 自动添加css前缀 css-loader: 能在js文件中导入css(配合React比较好,我猜) style-loader: 将所有的计算后 ...

  10. Go 转义字符

    Go 转义字符 package main import "fmt" func main() { fmt.Printf("Hello\tWorld!") } 本文 ...