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

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

然而我调了一个小时才发现我是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. 动态方法调用秘密武器 —— invokedynamic 指令解读 - MethodHandle

    原文:https://juejin.im/book/5c25811a6fb9a049ec6b23ee/section/5ccc66dd518825403b5975fb import java.lang ...

  2. Linux编程获取本机IP地址

    使用函数getifaddrs来枚举网卡IP,当中使用到的结构体例如以下所看到的: struct ifaddrs { struct ifaddrs *ifa_next; /* Next item in ...

  3. 尝试修改源码需要用到git存一下

    git reflog查看本地记录 git reset --hard 02a3260

  4. MVC--MVP?

    第一部分:什么是MVP?什么是MVC? 1.什么是MVP? M:数据层(数据库.网络.文件存储等等...) V:View和Activity和Fragment以及它们的子类 P:中介->Prese ...

  5. 2018-2-13-win10-uwp-iot

    title author date CreateTime categories win10 uwp iot lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:2 ...

  6. Spring mvc Hello World

    Spring mvc Hello World 添加依赖 <dependency> <groupId>org.springframework</groupId> &l ...

  7. [转]Netty入门(最简单的Netty客户端/服务器程序)

    Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是< ...

  8. H5调用腾讯地图

    获取当前定位的经纬度并在容器内显示当前位置 (安卓上的位置有点偏差) 在vue的index.html中需要引用 template <div id="container" st ...

  9. Kotlin -help

    { kotlin: run Kotlin programs, scripts or REPL. Usage: kotlin <options> <command> <ar ...

  10. 使用VC6.0编译C++代码的时候报错:fatal error C1071: unexpected end of file found in comment(Mark ZZ)

    fatal error C1071: unexpected end of file found in comment(Mark ZZ) 今天在一论坛上看到一人发帖: 『最近遇到一个奇怪的问题,代码中的 ...