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

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

----------------------------------------------------------------------------

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<stack>

using namespace std;

#define ok(x) (x == ‘h‘ || x == ‘m‘)

#define X(i) ((i << 1) - 1)

#define Y(i) ((i << 1) - 2)

const int maxn = 209;

struct edge {

int to;

edge* next;

} E[10000], *pt, *head[maxn];

void addedge(int u, int v) {

pt->to = v; pt->next = head[u]; head[u] = pt++;

}

int N, n, CK;

int dfn[maxn], low[maxn], scc[maxn];

stack<int> S;

void tarjan(int x) {

dfn[x] = low[x] = ++CK;

S.push(x);

for(edge* e = head[x]; e; e = e->next) if(!dfn[e->to]) {

tarjan(e->to);

low[x] = min(low[x], low[e->to]);

} else if(!scc[e->to])

low[x] = min(low[x], dfn[e->to]);

if(dfn[x] == low[x]) {

int t; n++;

do {

t = S.top(); S.pop();

scc[t] = n;

} while(t != x);

}

}

void init() {

pt = E; n = CK = 0;

memset(head, 0, sizeof head);

memset(dfn, 0, sizeof dfn);

memset(scc, 0, sizeof scc);

}

bool check() {

for(int i = N << 1; i--; ) if(!dfn[i]) tarjan(i);

for(int i = 1; i <= N; i++) if(scc[X(i)] == scc[Y(i)]) return false;

return true;

}

int main() {

int T; scanf("%d", &T);

while(T--) {

init();

int m; scanf("%d%d", &N, &m);

while(m--) {

int t[2]; char c[2];

for(c[0] = getchar(); !ok(c[0]); c[0] = getchar());

scanf("%d", t);

for(c[1] = getchar(); !ok(c[1]); c[1] = getchar());

scanf("%d", t + 1);

addedge(c[0] != ‘h‘ ? Y(t[0]) : X(t[0]), c[1] != ‘h‘ ? X(t[1]) : Y(t[1]));

addedge(c[1] != ‘h‘ ? Y(t[1]) : X(t[1]), c[0] != ‘h‘ ? X(t[0]) : Y(t[0]));

}

puts(check() ? "GOOD" : "BAD");

}

return 0;

}

----------------------------------------------------------------------------

1823: [JSOI2010]满汉全席

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1201  Solved: 576
[Submit][Status][Discuss]

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

HINT

Source

JSOI2010第二轮Contest2

时间: 2024-10-10 05:50:42

BZOJ 1823: [JSOI2010]满汉全席( 2-sat )的相关文章

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

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

bzoj 1823: [JSOI2010]满汉全席

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int t,n,m,head[205],next[2005],v[2005],cnt,dfn[205],cnt1,low[205]; 6 int zhan[205],zhan1[205],top,shu[205],shu1; 7 int du() 8 { 9 int a1; 10 char ch; 11

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

题目 传送门:QWQ 分析 2-sat模板(然而辣鸡如我还是调了好久) 代码 //bzoj 1823 2-sat #include <bits/stdc++.h> using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'

2-set 1823: [JSOI2010]满汉全席

这个题告诉我变量循环使用,一定要赋好初值!!!!!! 一定要赋好初值!!!!!!一定要赋好初值!!!!!!一定要赋好初值!!!!!! #include<iostream>#include<cstdio>#include<cstring>using namespace std;int t,n,m,head[205],next[2005],v[2005],cnt,dfn[205],cnt1,low[205];int zhan[205],zhan1[205],top,shu[

bzoj 1822: [JSOI2010]Frozen Nova 冷冻波 题解

[原题] 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 796  Solved: 218 [Submit][Status] Description WJJ喜欢"魔兽争霸"这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没

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

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

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

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

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

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

BZOJ 1823 JSOI 2010 满汉全席 2-SAT

题目大意:有n种材料,m个评委.每种材料有两种不同的做法,每个评委有两个判定标准,做出来的菜品必须满足每一个评委至少一个要求.问有没有这样的方案. 思路:2-SAT经典建图问题.因为每一种材料只能有两种做法,这种约束条件通常就想到2-SAT.每一个评委必须至少满足一种,这就是建图的条件. 所以连边A' -> B B' -> A 这样表示的是如果A不能满足某个评委,那么就必须让b满足这个评委. 然后就是Tarjan缩点,判断是否有个菜品的两种做法在一个scc中,若有就是无解,没有就是有解. CD