【刷题】BZOJ 1823 [JSOI2010]满汉全席
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
Solution
每种菜只能选 \(\text{m}\) 或者 \(\text{h}\) ,而且存在二元组的限制关系,2-sat问题
按照2-sat的方式连边,如果 \(\text{m}x\) 与 \(\text{h}y\) 存在题目所述关系,那么将 \(\text{h}x\) 与 \(\text{h}y\) 连边,\(\text{m}x\) 与 \(\text{m}y\) 连边;其它同理,代表如果在某一种菜,没有选择当前的其中一个限制,那么另一个限制就一定要满足。一条边就代表一个推导
最后跑tarjan缩点,看一个点的两种状态是否在同一个强连通分量里就好了
#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=200+10,MAXM=2000+10;
int T,n,m,e,cnt,LOW[MAXN],DFN[MAXN],Stack[MAXN],Visit_Num,Stack_Num,In_Stack[MAXN],Be[MAXN],to[MAXM<<1],beg[MAXN],nex[MAXM<<1];
template<typename T> inline void read(T &x)
{
	T data=0,w=1;
	char ch=0;
	while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
	if(ch=='-')w=-1,ch=getchar();
	while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
	x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+'0');
	if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void insert(int x,int y)
{
	to[++e]=y;
	nex[e]=beg[x];
	beg[x]=e;
}
inline int num(char *s)
{
	int res=0;
	for(register int i=1,lt=strlen(s);i<lt;++i)res=(res<<3)+(res<<1)+(s[i]^'0');
	return res;
}
inline void Tarjan(int x)
{
	DFN[x]=LOW[x]=++Visit_Num;
	In_Stack[x]=1;
	Stack[++Stack_Num]=x;
	for(register int i=beg[x];i;i=nex[i])
		if(!DFN[to[i]])Tarjan(to[i]),chkmin(LOW[x],LOW[to[i]]);
		else if(In_Stack[to[i]]&&DFN[to[i]]<LOW[x])LOW[x]=DFN[to[i]];
	if(DFN[x]==LOW[x])
	{
		int temp;++cnt;
		do{
			temp=Stack[Stack_Num--];
			In_Stack[temp]=0;
			Be[temp]=cnt;
		}while(temp!=x);
	}
}
int main()
{
	read(T);
	while(T--)
	{
		read(n);read(m);
		e=0;memset(beg,0,sizeof(beg));
		Visit_Num=0;cnt=0;
		memset(DFN,0,sizeof(DFN));
		memset(LOW,0,sizeof(LOW));
		for(register int i=1,u,v;i<=m;++i)
		{
			char s1[10],s2[10];scanf("%s%s",s1,s2);
			u=(num(s1)<<1)+(s1[0]=='h'?0:1);
			v=(num(s2)<<1)+(s2[0]=='h'?0:1);
			insert(u^1,v);insert(v^1,u);
		}
		for(register int i=2;i<=(n<<1)+1;++i)
			if(!DFN[i])Tarjan(i);
		int mk=1;
		for(register int i=1;i<=n;++i)
			if(Be[i<<1]==Be[(i<<1)^1]){mk=0;break;}
		if(!mk)puts("BAD");
		else puts("GOOD");
	}
	return 0;
}
												
											【刷题】BZOJ 1823 [JSOI2010]满汉全席的更多相关文章
- BZOJ 1823: [JSOI2010]满汉全席( 2-sat )
		
2-sat...假如一个评委喜好的2样中..其中一样没做, 那另一样就一定要做, 这样去建图..然后跑tarjan. 时间复杂度O((n+m)*K) ------------------------- ...
 - bzoj 1823: [JSOI2010]满汉全席 && bzoj 2199 : [Usaco2011 Jan]奶牛议会 2-sat
		
noip之前学的内容了,看到题竟然忘了怎么建图了,复习一下. 2-sat 大概是对于每个元素,它有0和1两种选择,必须选一个但不能同时选.这之间又有一些二元关系,比如x&y=1等等... 先把 ...
 - bzoj 1823: [JSOI2010]满汉全席
		
#include<iostream> #include<cstdio> #include<cstring> using namespace std; ],next[ ...
 - bzoj 1823: [JSOI2010]满汉全席【2-SAT+tarjan】
		
因为每种食材只有一份,所以两个评委的如果有要求同一种食材的两种做法就是不可行,用这个来建立2-SAT模型 然后跑tarjan判可行性即可 #include<iostream> #inclu ...
 - 2-sat基础题  BZOJ 1823
		
http://www.lydsy.com/JudgeOnline/problem.php?id=1823 1823: [JSOI2010]满汉全席 Time Limit: 10 Sec Memory ...
 - 【BZOJ】1823: [JSOI2010]满汉全席(2-sat)
		
题目 传送门:QWQ 分析 2-sat模板(然而辣鸡如我还是调了好久) 代码 //bzoj 1823 2-sat #include <bits/stdc++.h> using namesp ...
 - 1823: [JSOI2010]满汉全席 2-sat
		
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1823 思路 建图,缩点tarjan 判断impossible 代码 #include < ...
 - 2-set  1823: [JSOI2010]满汉全席
		
这个题告诉我变量循环使用,一定要赋好初值!!!!!! 一定要赋好初值!!!!!!一定要赋好初值!!!!!!一定要赋好初值!!!!!! #include<iostream>#include& ...
 - bzoj1823 [JSOI2010]满汉全席(2-SAT)
		
1823: [JSOI2010]满汉全席 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1246 Solved: 598[Submit][Status ...
 
随机推荐
- jqgrid 在表格底部添加自定义按钮
			
往往我们需要在jqgrid底部的分页行中添加一些自定义按钮,效果如下: 上图中,三个按钮均是自定义添加上的. 1.要新增自定义按钮在表格底部,仍离不开分页div,需要给jqgrid绑定分页方法 2.由 ...
 - PHP封装curl的调用接口及常用函数
			
<?php /** * @desc 封装curl的调用接口,post的请求方式 */ function doCurlPostRequest($url, $requestString, $time ...
 - python安装opencv
			
执行命令:pip install opencv-python即可
 - 【LeeCode88】Merge Sorted Array★
			
1.题目描述: 2.解题思路: 题意:两个由整数构成的有序数组nums1和nums2,合并nums2到nums1,使之成为一个有序数组.注意,假设数组nums1有足够的空间存储nums1和nums2的 ...
 - storm报错:Exception in thread "main" java.lang.RuntimeException: InvalidTopologyException(msg:Component: [mybolt] subscribes from non-existent stream: [default] of component [kafka_spout])
			
问题描述: storm版本:1.2.2,kafka版本:2.11. 在使用storm去消费kafka中的数据时,发生了如下错误. [root@node01 jars]# /opt/storm-1. ...
 - 2017-2018-2 『网络对抗技术』Exp3:免杀原理与实践
			
1. 免杀原理与实践说明 一.实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧:(1.5分) ...
 - 2017-2018-2 《网络对抗技术》20155322 Exp9 web安全基础
			
[-= 博客目录 =-] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 2-实践过程 2.1-HTML 2.2-Injection Flaws 2.3-XSS 2.4-CSRF ...
 - 【WPF】两则动画效果
			
原文:[WPF]两则动画效果 引言 利用WPF的动画可以轻而易举的实现各种各样的特效,如擦除,滑动进入等,先看两个效果图 第一个效果 这个动画其实利用了OpacityMask和LinearGradie ...
 - [Oracle]OpenVMS 运行 Oracle 时的推荐值
			
PQL Parameters ORACLE Account ------------------ ------------------------- PQL_M ...
 - Java 多线程(三)之线程状态及其验证
			
目录 线程状态 Thread.State 状态类型 定义 说明 状态转换 状态验证 「NEW」-> 「RUNNABLE」 -> 「TERMINATED」 「RUNNABLE」 -> ...