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

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

然而我调了一个小时才发现我是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. 十、 shell基础

    shell的表现形式: history -c 清空历史命令(清空缓存;默认:1000条) -w 将缓存中的历史命令保存到配置文件中 ~/.bash_history 永久保存历史命令(默认:1000条) ...

  2. the blank final field factors may not have been initialized

    Q1: why we should initialize final field before completion of new instance? final means no changeabl ...

  3. IDEA 创建Spring cloud Eureka 注册中心

    IDEA 创建Spring cloud Eureka 注册中心 一. 首先创建一个maven project Next之后填好groupId与artifactId,Next之后填好项目名与路径,点击F ...

  4. Linux 系统 /var/log/journal/ 垃圾日志清理

    CentOS系统中有两个日志服务,分别是传统的 rsyslog 和 systemd-journal systemd-journald是一个改进型日志管理服务,可以收集来自内核.系统早期启动阶段的日志. ...

  5. mysql和postgresql查询数据库中哪些表包含某个字段

    想知道数据库中哪表含有edu_status字段   mysql> select table_name,column_name from information_schema.columns wh ...

  6. shell脚本中关于日期的操作

    一.计算指定日期的前一天的日期 date -d "yesterday 20150401 " +%Y%m%d 二.如果获取当前日期的前一天        date -d " ...

  7. Java 基础 - JDK 和 JRE 有什么区别

    总结 JRE(Java Runtime Environment),就是 Java 运行环境,包括JVM虚拟机(java.exe等)和基本的类库(rt.jar等). JDK (Java Developm ...

  8. 在myeclipse安装beyond插件

    目录 文章背景 目录 环境介绍 安装步骤 说明 参考文章 版本记录 文章背景 myeclipse自带的比较工具感觉是有一些看不清晰,也不是太方便处理,然后就找了个比较插件了. 目录 环境介绍 myec ...

  9. 尚学python课程---15、python进阶语法

    尚学python课程---15.python进阶语法 一.总结 一句话总结: python使用东西要引入库,比如 json 1.python如何创建类? class ClassName: :以冒号结尾 ...

  10. Delphi中的Sender:TObject对象解析转载

    https://blog.csdn.net/jl_tiny/article/details/24376661 Delphi中的Sender:TObject对象解析 procedure TForm1.B ...