题目描述

满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中。由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专家认证的满汉全席,也是中国厨师最大的荣誉之一。世界满汉全席协会是由能够料理满汉全席的专家厨师们所组成,而他们之间还细分为许多不同等级的厨师。

为了招收新进的厨师进入世界满汉全席协会,将于近日举办满汉全席大赛,协会派遣许多会员当作评审员,为的就是要在參赛的厨师之中,找到满汉料理界的明日之星。

大会的规则如下:每位參赛的选手可以得到n 种材料,选手可以自由选择用满式或是汉式料理将材料当成菜肴。

大会的评审制度是:共有m 位评审员分别把关。每一位评审员对于满汉全席有各自独特的見解,但基本见解是,要有兩样菜色作为满汉全席的标志。如某评审认为,如果没有汉式东坡肉跟满式的涮羊肉锅,就不能算是满汉全席。但避免过于有主見的审核,大会规定一个评审员除非是在认为必备的两样菜色都没有做出來的狀况下,才能淘汰一位选手,否则不能淘汰一位參赛者。

换句话說,只要參赛者能在这兩种材料的做法中,其中一个符合评审的喜好即可通过该评审的审查。如材料有猪肉,羊肉和牛肉时,有四位评审员的喜好如下表:

评审一 评审二 评审三 评审四
满式牛肉 满式猪肉 汉式牛肉 汉式牛肉
汉式猪肉 满式羊肉 汉式猪肉 满式羊肉 

如參赛者甲做出满式猪肉,满式羊肉和满式牛肉料理,他将无法满足评审三的要求,无法通过评审。而參赛者乙做出汉式猪肉,满式羊肉和满式牛肉料理,就可以满足所有评审的要求。

但大会后來发现,在这样的制度下如果材料选择跟派出的评审员没有特别安排好的话,所有的參赛者最多只能通过部分评审员的审查而不是全部,所以可能会发生没有人通过考核的情形。

如有四个评审员喜好如下表时,则不论参赛者采取什么样的做法,都不可能通过所有评审的考核:

评审一 评审二 评审三 评审四
满式羊肉 满式猪肉 汉式羊肉 汉式羊肉
汉式猪肉 满式羊肉 汉式猪肉 满式猪肉 

所以大会希望有人能写一个程序來判断,所选出的m 位评审,会不会发生 没有人能通过考核的窘境,以便协会组织合适的评审团。

输入输出格式

输入格式:

第一行包含一个数字 K,代表测试文件包含了K 组资料。

每一组测试资料的第一行包含兩个数字n 跟m(n≤100,m≤1000),代表有n 种材料,m 位评审员。

为方便起見,材料舍弃中文名称而给予编号,编号分别从1 到n。

接下來的m 行,每行都代表对应的评审员所拥有的兩个喜好,每个喜好由一个英文字母跟一个数字代表,如m1 代表这个评审喜欢第1 个材料透过满式料理做出來的菜,而h2 代表这个评审员喜欢第2 个材料透过汉式料理做出來的菜。

每个测试文件不会有超过50 组测试资料

输出格式:

每笔测试资料输出一行,如果不会发生没有人能通过考核的窘境,输出GOOD;否则输出BAD(大写字母)。

输入输出样例

输入样例#1: 复制

1
2 4
h1 m2
m2 m1
h1 h2
m1 h2

输出样例#1: 复制

BAD

Solution

题目太长了,一句话题意,有一些原材料,每个材料可以选择做两个菜中的一个,你要选择这些材料做菜,使得满足所有的评委要求的菜品,每个评委有两道菜,至少满足一个就够了。
2-SAT?怎么建图?
我们把一到材料分成两个点,\(i\)和\(i+n\),看样例,假设我们选了m1,我们就不能选h1了,因为一到材料只能做一道菜,那么意味着我们必须要选m2,因为要满足第一个评委,所以m1向m2连边,代表选了m1必须选m2,同理,我们选了h2,必须选h1,这还是对于第一个评委的要求。
就这样建图,最后跑一遍tarjan缩点,我们只需判断\(i\)和\(i+n\)是否在同一个强连通分量就行了,如果在同一个强连通分量,说明有冲突,根据边的含义,这意味着同一个材料要同时做两道菜,所以不合法。
代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{int to,next;
}a[4011];
int len,last[500],cnt,siz,vis[500],stack[500],dfn[500],low[510],top,belong[510];
void add(int a1,int a2)
{a[++len].to=a2;a[len].next=last[a1];last[a1]=len;
}
void tarjan(int x)
{dfn[x]=low[x]=++siz;vis[x]=1;stack[++top]=x;for(int i=last[x];i;i=a[i].next){int to=a[i].to;if(!dfn[to]){tarjan(to);low[x]=min(low[x],low[to]);}else if(vis[to]) low[x]=min(low[x],dfn[to]);}if(dfn[x]==low[x]){int to=0;cnt++;while(x!=to){to=stack[top--];vis[to]=0;belong[to]=cnt;}}
}
int main()
{char s[5];int t;cin>>t;while(t--){int n,m,k1,k2;len=0;siz=0;top=0;memset(last,0,sizeof(last));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(belong,0,sizeof(belong));cin>>n>>m;for(int i=1;i<=m;i++){int p=0;scanf("%s",s);for(int j=1;j<strlen(s);j++)p=p*10+(s[j]^48);if(s[0]=='h')k1=p;else k1=p+n;p=0;scanf("%s",s);for(int j=1;j<strlen(s);j++)p=p*10+(s[j]^48);if(s[0]=='h')k2=p;else k2=p+n;if(k1<=n) add(k1+n,k2);else add(k1-n,k2);if(k2<=n) add(k2+n,k1);else add(k2-n,k1);}for(int i=1;i<=n;i++)if(!dfn[i]) tarjan(i);int flag=1;for(int i=1;i<=n;i++)if(belong[i]==belong[i+n])flag=0;if(flag) printf("GOOD\n");else printf("BAD\n");}
}

博主蒟蒻,可以随意转载,但必须附上原文链接k-z-j。

转载于:https://www.cnblogs.com/kzj-pwq/p/9507567.html

[JSOI2010] 满汉全席相关推荐

  1. Bzoj1823 [JSOI2010]满汉全席

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

  2. BZOJ1823:[JSOI2010]满汉全席(2-SAT)

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

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

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

  4. [洛谷P4171][JSOI2010]满汉全席

    题目大意:有$n$个点,每个点可以选或不选,有$m$组约束,形如$a,u,b,v$,表示$u=a,v=b$中至少要满足一个条件,问是否存在一组解,多组询问 题解:$2-SAT$,感觉是板子题呀,最后判 ...

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

    题目 传送门:QWQ 分析 2-sat模板(然而辣鸡如我还是调了好久) 代码 //bzoj 1823 2-sat #include <bits/stdc++.h> using namesp ...

  6. BZOJ1823:[JSOI2010]满汉全席——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1823 https://www.luogu.org/problemnew/show/P4171 题面 ...

  7. P4171 [JSOI2010]满汉全席

    简要的学了一下2-sat,然而不会输出方案. 就是个sb模板题啦 // luogu-judger-enable-o2 #include<bits/stdc++.h> #define il ...

  8. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  9. 图论2-SAT算法详解

    图论2-SAT算法详解 今天我们来介绍一个我个人认为最难的算法,这是为什么呢?肯定会有许多dalao说,不就一个2-SAT,我两分钟就A掉了.然而2-SAT的细节非常的多,稍不注意就会写错,而且测试困 ...

最新文章

  1. 徐直军 华为没有鸿蒙,华为徐直军:“鸿蒙”这个名字是媒体取的
  2. R 包 pathview 代谢通路可视化
  3. 中大计算机研究生英语免修条件,通知|关于接受2017级理科研究生 基础英语课程免修免考申请的通知...
  4. (Prototype)原型模式的Java实现(转)
  5. Vue2.0通过二级路由实现页面切换
  6. 【动态规划】数字金字塔
  7. GARFIELD@10-31-2004
  8. 机器学习基础(十四)—— 统计计数、majority count 与其数学记号
  9. Quartus17打开RTL视图
  10. 微服务,软件应用开发的新纪元
  11. 微信朋友圈评论功能测试
  12. 批处理之for /r
  13. 《麦肯锡卓越工作方法》读后感
  14. QQ互联开发者信息认证
  15. ASP的技术特点与使用方法
  16. 面试:1.C#中的委托是什么?事件是一种委托吗?
  17. chrome浏览器怎么模拟手机访问网页(已測OK)
  18. 简单却巧妙,工程师创意太牛了!
  19. HDU-1567-A/B——算法笔记
  20. Edge 浏览器新版来袭,Office 功能首次出现!

热门文章

  1. linux中特殊字符的含义,Linux中的特殊符号以及特殊语法
  2. java arraylist实现_java实现ArrayList基本功能
  3. c mysql 中文字符_在C#和MySQL中存取中文字符时避免乱码的方法
  4. 评估微型计算机的主要指标,微型计算机的工作过程和主要性能指标.doc
  5. ?php query_posts(cat)?,query_posts()函数 (wordpress日志调用)
  6. c# getresponsestream返回byte[]_C# 基础知识系列-13 常见类库(三)
  7. ecplice中class.forname一直报错_英雄联盟LOL闪退,弹出吉格斯报错BUGSPLAT
  8. hive mysql hdfs关系_Hive中的数据库、表、数据与HDFS的对应关系
  9. c语言提高 17,C语言提高-第17讲: 一维数组的定义和引用(数组大折腾)
  10. linux离线安装ftp_安装Kali Linux之后要做的前10件事