【题解】JSOI2010满汉全席

~bzoj1823

第一次接触2-SAT——SAT,即适定性(Satisfiability)的缩写。像名称所说,即满足需求的可能性问题,而k-SAT即每个人有k种需求,已经证明k>2时是一个NP完全问题。所以现在常见的考法便是2-SAT。

这一道题目算是一道裸的2-SAT问题。每一个人有两种需求,那么我们就将每一种食物拆成两个点,一个代表m,一个代表h,可以注意到满足所有人的需求即如果满足不了其中一个,必须满足另一个,所以我们建图的方法为从无法满足要求的点连向必须满足的点,代表若一个点不符合要求,必然走向后续的决策。那么问题的答案相比到这里已经比较明了了。我们就应当在这张图上求出强连通分量,看是否有一个点的两个拆点都存在于这张图上。若是如此,就说明无法满足要求。

#include <bits/stdc++.h>
using namespace std;
#define maxn 100000
int T, cnt, cnp = 1, n, m, low[maxn], dfn[maxn], num[maxn], timer, head[maxn];
bool flag, mark[maxn], vis[maxn];
stack <int> st;
struct edge
{
    int to, last;
}E[maxn];

int read()
{
    int x = 0;
    char c;
    c = getchar();
    while(c < ‘0‘ || c > ‘9‘) c = getchar();
    while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - ‘0‘, c = getchar();
    return x;
}

void add(int u, int v)
{
    E[cnp].to = v, E[cnp].last = head[u], head[u] = cnp ++;
}

void tarjan(int u)
{
    dfn[u] = low[u] = ++ timer;
    vis[u] = true, mark[u] = true;
    st.push(u);
    for(int i = head[u]; i; i = E[i].last)
    {
        int v = E[i].to;
        if(vis[v])
          { if(mark[v] && low[u] > dfn[v]) low[u] = dfn[v]; }
        else
        {
            tarjan(v);
            low[u] = min(low[u], low[v]);
        }
    }
    if(dfn[u] == low[u])
    {
        ++ cnt;
        int j;
        do
        {
            j = st.top();
            st.pop();
            mark[j] = false;
            num[j] = cnt;
        }while(!st.empty() && j != u);
    }
}

void init()
{
    memset(vis, 0, sizeof(vis));
    memset(head, 0, sizeof(head));
    cnp = 1, timer = 0;
    flag = false;
}

int main()
{
    T = read();
    while(T --)
    {
        n = read(), m = read();
        init();
        for(int i = 1; i <= m; i ++)
        {
            char c1, c2;
            int d1, d2;
            cin >> c1 >> d1 >> c2 >> d2;
            int a = 0, b = 0;
            a += (c1 == ‘h‘), b += (c2 == ‘h‘);
            add(((2 * d2) + b) ^ 1, (2 * d1) + a);
            add(((2 * d1) + a) ^ 1, 2 * d2 + b);
        }
        for(int i = 2; i <= 2 * n + 1; i ++)
            if(!vis[i]) tarjan(i);
        for(int i = 2; i <= 2 * n; i += 2)
            if(num[i] == num[i ^ 1])
            {
                printf("BAD\n");
                flag = true; break;
            }
        if(!flag) printf("GOOD\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/twilight-sx/p/8436914.html

时间: 2024-11-09 00:32:57

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

【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了以后这题基本就出来了 因为本题根本不用

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

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

【题解】 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:\) 这种题有两种状态,只能在这两种状

【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&

luoguP4171 [JSOI2010]满汉全席

前言 由于蒟蒻才刚开始学 \(\text{2-SAT}\),所以题解中有的地方可能不够精炼,望多包涵! 题目描述 题目意思很简单,标准的\(\text{2-SAT}\)问题模型.那么我们就先来介绍一下 \(\text{2-SAT}\) (以下是个人的小小概括) \(\text{2-SAT}\) 问题,抽象化一下,是这样的: 给出 \(n\) 个布尔变量 \(\{x_n\}\),以及 \(m\) 个命题 \((a,aa,b,bb)\),一个命题成立的条件是\([x_a=aa]\lor[x_b=bb