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

\(Descripion:\)

给出 \(n\) 种材料,有 \(m\) 个人,每个人会要求对某种材料进行汉式和满式两种加工。

一种材料只能用一次,问是否有可能满足全部人的要求。(满足定义是有一项他提出的菜做了)。

\(Sample\) \(Input:\)

2
3 4
m3 h1
m1 m2
h1 h3
h3 m2
2 4
h1 m2
m2 m1
h1 h2
m1 h2

\(Sample\) \(Output:\)

GOOD
BAD

\(Solution:\)

这种题有两种状态,只能在这两种状态里选,并且有限制,很明显是 \(2-SAT\) 的题。

考虑把满和汉两种烹饪分成两种状态,连边其实就是 或运算 连边

也就是如果这个点不选,那另一个肯定得选,如果另一个不选,那这个就就得选。

#include<bits/stdc++.h>
using namespace std;
int n,m,k,En,num,cnt,top;
const int N=205,M=2005;
int scc[N+N],head[N+N],dfn[N+N],low[N+N];
int s[N+N],ins[N+N];
char s1[10],s2[10];
struct edge {
    int next,to;
}E[M<<1];
inline void Get(int &a,int &b){
    char ch=getchar();
    while(ch!='h' && ch!='m') ch=getchar();
    a=(ch=='h');
    scanf("%d",&b);
}
inline void add(int from,int to){
    E[++En].next=head[from];
    E[En].to=to;
    head[from]=En;
}
inline void tarjan(int u){
    dfn[u]=low[u]=++num;
    ins[u]=1;
    s[++top]=u;
    for(int i=head[u];i;i=E[i].next){
        int v=E[i].to;
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(ins[v])
            low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u]){
        scc[u]=++cnt;
        ins[u]=0;
        while(s[top]!=u){
            ins[s[top]]=0;
            scc[s[top]]=cnt;
            top--;
        }
        top--;
    }
}
inline bool two_sat(){
    for(int i=1;i<=n;++i)
        if(scc[i]==scc[i+n]) return false;
    return true;
}
int main(){
    scanf("%d",&k);
    while(k--){
        num=cnt=En=0;
        memset(scc,0,sizeof(scc));
        memset(head,0,sizeof(head));
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(E,0,sizeof(E));
        memset(ins,0,sizeof(ins));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;++i){
            int ax=0,ay=0;
            int bx=0,by=0;
            Get(ax,ay);
            Get(bx,by);
            add(ay+(!ax)*n,by+n*bx);
            add(by+(!bx)*n,ay+n*ax);
        }
        for(int i=1;i<=n+n;++i)
            if(!dfn[i]) tarjan(i);
        if(two_sat()) puts("GOOD");
        else puts("BAD");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/JCNL666/p/10752681.html

时间: 2024-10-13 04:02:17

【题解】 P4171 [JSOI2010]满汉全席的相关文章

Luogu P4171 [JSOI2010]满汉全席(2-SAT)

P4171 [JSOI2010]满汉全席 题意 题目描述 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族料理方式,呈现在数量繁多的菜色之中.由于菜色众多而繁杂,只有极少数博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专家认证的满汉全席,也是中国厨师最大的荣誉之一.世界满汉全席协会是由能料理满汉全席的专家厨师们所组成,而他们之间还细分为许多不同等级的厨师. 为了招收新进的厨师进入世界满汉全席协会,将于近日举办满汉全席大赛,协会派遣许多会员当作评审员,为的就是要在参赛的

【题解】JSOI2010满汉全席

~bzoj1823 第一次接触2-SAT--SAT,即适定性(Satisfiability)的缩写.像名称所说,即满足需求的可能性问题,而k-SAT即每个人有k种需求,已经证明k>2时是一个NP完全问题.所以现在常见的考法便是2-SAT. 这一道题目算是一道裸的2-SAT问题.每一个人有两种需求,那么我们就将每一种食物拆成两个点,一个代表m,一个代表h,可以注意到满足所有人的需求即如果满足不了其中一个,必须满足另一个,所以我们建图的方法为从无法满足要求的点连向必须满足的点,代表若一个点不符合要求

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

[BZOJ1823][JSOI2010]满汉全席 Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专家认证的满汉全席,也是中国厨师最大的荣誉之一. 世界满汉全席协会是由能够料理满汉全席的专家厨师们所组成,而他们之间还细分为许多不同等级的厨师.为了招收新进的厨师进入世界满汉全席协会,将于近日举办满汉全席大赛,协会派遣许多会员当作评审员

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

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

bzoj1823 JSOI2010 满汉全席 2-SAT 经典建模

这个题其实我一开始看完没有想到2-SAT 而思路巧妙,编程复杂度低也是我选这个题的原因,在3h4t的赛制中非常适合(好像是病句..) 具体的来说就是,因为每种材料都有两个选择,那就是做成满式或者是汉式 那么我们可以考虑,在信息学奥赛中,只有两种选择的有哪些.. 看来只有二分图和2-SAT了? 然后我们注意到,每个选择是互相排斥的,那么这不正好符合2-SAT的性质么?--每个布尔变量只能是成立或者是不成立,这与满式汉式这好一样. 好那如果你已经想到2-SAT了以后这题基本就出来了 因为本题根本不用

【BZOJ1823】 [JSOI2010]满汉全席

Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专家认证的满汉全席,也是中国厨师最大的荣誉之一. 世界满汉全席协会是由能够料理满汉全席的专家厨师们所组成,而他们之间还细分为许多不同等级的厨师.为了招收新进的厨师进入世界满汉全席协会,将于近日举办满汉全席大赛,协会派遣许多会员当作评审员,为的就是要在參赛的厨师之中,找到满汉料理界的明日

[BZOJ 1823][JSOI2010]满汉全席(2-SAT)

Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专家认证的满汉全席,也是中国厨师最大的荣誉之一. 世界满汉全席协会是由能够料理满汉全席的专家厨师们所组成,而他们之间还细分为许多不同等级的厨师.为了招收新进的厨师进入世界满汉全席协会,将于近日举办满汉全席大赛,协会派遣许多会员当作评审员,为的就是要在參赛的厨师之中,找到满汉料理界的明日

BZOJ1823 [JSOI2010]满汉全席 2-sat

原文链接http://www.cnblogs.com/zhouzhendong/p/8125944.html 题目传送门 - BZOJ1823 题意概括 有n道菜,分别可以做成满式和汉式(每道菜只能做成一种形式),有m个专家. 每个专家喜欢两种菜,比如汉式猪肉和满式牛肉. 问是否存在方案使得所有专家都被满足. 题解 2-sat模版题,连方案都不用输出,水过-- 代码 #include <cstring> #include <cstdio> #include <cstdlib&

[JSOI2010]满汉全席 2-SAT

https://www.luogu.org/problemnew/show/P4171 意识到图中只有两种不同的菜系:满和汉 并且检查员类似于一个约束,可以发现这就是一个2-sat模型,满和汉分别对应true和false 由于只是检查可行性,只需要判断存在点的true个false存在同一个强连通分量即可. #include <map> #include <set> #include <ctime> #include <cmath> #include <