博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2-sat基础题 BZOJ 1823
阅读量:7063 次
发布时间:2019-06-28

本文共 4002 字,大约阅读时间需要 13 分钟。

http://www.lydsy.com/JudgeOnline/problem.php?id=1823

1823: [JSOI2010]满汉全席

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1927  Solved: 932
[][][]

Description

满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中。由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专家认证的满汉全席,也是中国厨师最大的荣誉之一。 世界满汉全席协会是由能够料理满汉全席的专家厨师们所组成,而他们之间还细分为许多不同等级的厨师。为了招收新进的厨师进入世界满汉全席协会,将于近日举办满汉全席大赛,协会派遣许多会员当作评审员,为的就是要在參赛的厨师之中,找到满汉料理界的明日之星。 大会的规则如下:每位參赛的选手可以得到n 种材料,选手可以自由选择用满式或是汉式料理将材料当成菜肴。大会的评审制度是:共有m 位评审员分别把关。每一位评审员对于满汉全席有各自独特的見解,但基本见解是,要有兩样菜色作为满汉全席的标志。如某评审认为,如果没有汉式东坡肉跟满式的涮羊肉锅,就不能算是满汉全席。但避免过于有主見的审核,大会规定一个评审员除非是在认为必备的两样菜色都没有做出來的狀况下,才能淘汰一位选手,否则不能淘汰一位參赛者。换句话說,只要參赛者能在这兩种材料的做法中,其中一个符合评审的喜好即可通过该评审的审查。如材料有猪肉,羊肉和牛肉时,有四位评审员的喜好如下表: 评审一 评审二 评审三 评审四 满式牛肉 满式猪肉 汉式牛肉 汉式牛肉 汉式猪肉 满式羊肉 汉式猪肉 满式羊肉 如參赛者甲做出满式猪肉,满式羊肉和满式牛肉料理,他将无法满足评审三的要求,无法通过评审。而參赛者乙做出汉式猪肉,满式羊肉和满式牛肉料理,就可以满足所有评审的要求。 但大会后來发现,在这样的制度下如果材料选择跟派出的评审员没有特别安排好的话,所有的參赛者最多只能通过部分评审员的审查而不是全部,所以可能会发生没有人通过考核的情形。如有四个评审员喜好如下表时,则不論參赛者采取什么样的做法,都不可能通过所有评审的考核: 评审一 评审二 评审三 评审四 满式羊肉 满式猪肉 汉式羊肉 汉式羊肉 汉式猪肉 满式羊肉 汉式猪肉 满式猪肉 所以大会希望有人能写一个程序來判断,所选出的m 位评审,会不会发生 没有人能通过考核的窘境,以便协会组织合适的评审团。

Input

第一行包含一个数字 K,代表测试文件包含了K 组资料。每一组测试资料的第一行包含兩个数字n 跟m(n≤100,m≤1000),代表有n 种材料,m 位评审员。为方便起見,材料舍弃中文名称而给予编号,编号分别从1 到n。接下來的m 行,每行都代表对应的评审员所拥有的兩个喜好,每个喜好由一个英文字母跟一个数字代表,如m1 代表这个评审喜欢第1 个材料透过满式料理做出來的菜,而h2 代表这个评审员喜欢第2 个材料透过汉式料理做出來的菜。每个测试文件不会有超过50 组测试资料

Output

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

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

 

思路:

对于一对《A,B》

链接A'->B, B'->A即可

 

//看看会不会爆int!数组会不会少了一维!//取物问题一定要小心先手胜利的条件#include 
using namespace std;#pragma comment(linker,"/STACK:102400000,102400000")#define LL long long#define ALL(a) a.begin(), a.end()#define pb push_back#define mk make_pair#define fi first#define se second#define haha printf("haha\n")/*n种材料,m个评审员。两种都没有做出来才能淘汰*/const int maxn = 1000 + 5;int n, m;struct Tarjan{ int n; int pre[maxn*2], low[maxn*2], sccno[maxn*2], dfstime, scc_cnt; stack
s; vector
G[maxn*2]; void init(int n){ this->n = n; for (int i = 0; i <= n * 2; i++) G[i].clear(); while (!s.empty()) s.pop(); } void add_edge(int x, int y){ G[x].push_back(y); } void dfs(int u){ pre[u] = low[u] = ++dfstime; int len = G[u].size(); s.push(u); for (int i = 0; i < len; i++){ int v = G[u][i]; if (pre[v] == -1){ dfs(v); low[u] = min(low[u], low[v]); } else if (!sccno[v]){
///下面为什么是pre[v]而不是low[v](两者都可以) low[u] = min(low[u], pre[v]);///因为环装最后总会变回来,一样的 } } if (low[u] == pre[u]){ scc_cnt++; while (true){ int x = s.top(); s.pop(); sccno[x] = scc_cnt; if (x == u) break; } } return ; } bool solve(){ memset(pre, -1, sizeof(pre)); memset(low, 0, sizeof(low)); memset(sccno, 0, sizeof(sccno)); dfstime = scc_cnt = 0; for (int i = 0; i < 2 * n; i++){ if (pre[i] == -1) dfs(i); } for (int i = 0; i < 2 * n; i += 2){ if (sccno[i] == sccno[i + 1]) return false; } return true; }};Tarjan tar;int main(){ int t; cin >> t; while (t--){ scanf("%d%d", &n, &m); tar.init(n); for (int i = 1; i <= m; i++){ char a[5], b[5]; scanf("%s%s", a, b); int x = 0; for (int j = 1; a[j] != '\0'; j++) x = x * 10 + a[j] - '0'; int y = 0; for (int j = 1; b[j] != '\0'; j++) y = y * 10 + b[j] - '0'; x--, y--; x = x * 2, y = y * 2; int fx = x + (a[0] == 'h'), fy = y + (b[0] == 'h'); tar.add_edge(fx ^ 1, fy); tar.add_edge(fy ^ 1, fx); } if (tar.solve()) puts("GOOD"); else puts("BAD"); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/heimao5027/p/6575983.html

你可能感兴趣的文章
为什么你不能在 MySQL 3.x 版本上安装 Joomla 1.5.23
查看>>
文件管理相关命令
查看>>
Guava库学习:学习使用Strings和Charsets类
查看>>
学习strings、strconv包
查看>>
如何在Sharepoint Online中创建调查问卷
查看>>
Exchange 2013公网证书配置
查看>>
Java开发在线打开编辑保存Word文件
查看>>
将学习进行到底!为普通人的奋斗送福
查看>>
常用十大python机器学习库
查看>>
TCP/IP三次握手四次挥手
查看>>
Systemstate Dump分析经典案例(下)
查看>>
PHPcms怎么调用二级栏目
查看>>
中小型网络构建案例——防火墙的应用
查看>>
Okhttp3使用
查看>>
交换的江湖
查看>>
ubuntu16.04 双网卡绑定
查看>>
lLinux学习笔记之apache及论坛的发布
查看>>
上三角
查看>>
C# 多线程学习系列二
查看>>
简单词法分析器的实现
查看>>