javascript
BZOJ1823:[JSOI2010]满汉全席(2-SAT)
Description
滿漢全席是中國(guó)最豐盛的宴客菜肴,有許多種不同的材料透過(guò)滿族或是漢族的料理方式,呈現(xiàn)在數(shù)量繁多的菜色之中。由于菜色眾多而繁雜,只有極少數(shù)博學(xué)多聞技藝高超的廚師能夠做出滿漢全席,而能夠烹飪出經(jīng)過(guò)專家認(rèn)證的滿漢全席,也是中國(guó)廚師最大的榮譽(yù)之一。 世界滿漢全席協(xié)會(huì)是由能夠料理滿漢全席的專家廚師們所組成,而他們之間還細(xì)分為許多不同等級(jí)的廚師。為了招收新進(jìn)的廚師進(jìn)入世界滿漢全席協(xié)會(huì),將于近日舉辦滿漢全席大賽,協(xié)會(huì)派遣許多會(huì)員當(dāng)作評(píng)審員,為的就是要在參賽的廚師之中,找到滿漢料理界的明日之星。 大會(huì)的規(guī)則如下:每位參賽的選手可以得到n 種材料,選手可以自由選擇用滿式或是漢式料理將材料當(dāng)成菜肴。大會(huì)的評(píng)審制度是:共有m 位評(píng)審員分別把關(guān)。每一位評(píng)審員對(duì)于滿漢全席有各自獨(dú)特的見(jiàn)解,但基本見(jiàn)解是,要有兩樣菜色作為滿漢全席的標(biāo)志。如某評(píng)審認(rèn)為,如果沒(méi)有漢式東坡肉跟滿式的涮羊肉鍋,就不能算是滿漢全席。但避免過(guò)于有主見(jiàn)的審核,大會(huì)規(guī)定一個(gè)評(píng)審員除非是在認(rèn)為必備的兩樣菜色都沒(méi)有做出來(lái)的狀況下,才能淘汰一位選手,否則不能淘汰一位參賽者。換句話說(shuō),只要參賽者能在這兩種材料的做法中,其中一個(gè)符合評(píng)審的喜好即可通過(guò)該評(píng)審的審查。如材料有豬肉,羊肉和牛肉時(shí),有四位評(píng)審員的喜好如下表: 評(píng)審一 評(píng)審二 評(píng)審三 評(píng)審四 滿式牛肉 滿式豬肉 漢式牛肉 漢式牛肉 漢式豬肉 滿式羊肉 漢式豬肉 滿式羊肉 如參賽者甲做出滿式豬肉,滿式羊肉和滿式牛肉料理,他將無(wú)法滿足評(píng)審三的要求,無(wú)法通過(guò)評(píng)審。而參賽者乙做出漢式豬肉,滿式羊肉和滿式牛肉料理,就可以滿足所有評(píng)審的要求。 但大會(huì)后來(lái)發(fā)現(xiàn),在這樣的制度下如果材料選擇跟派出的評(píng)審員沒(méi)有特別安排好的話,所有的參賽者最多只能通過(guò)部分評(píng)審員的審查而不是全部,所以可能會(huì)發(fā)生沒(méi)有人通過(guò)考核的情形。如有四個(gè)評(píng)審員喜好如下表時(shí),則不論參賽者采取什么樣的做法,都不可能通過(guò)所有評(píng)審的考核: 評(píng)審一 評(píng)審二 評(píng)審三 評(píng)審四 滿式羊肉 滿式豬肉 漢式羊肉 漢式羊肉 漢式豬肉 滿式羊肉 漢式豬肉 滿式豬肉 所以大會(huì)希望有人能寫(xiě)一個(gè)程序來(lái)判斷,所選出的m 位評(píng)審,會(huì)不會(huì)發(fā)生 沒(méi)有人能通過(guò)考核的窘境,以便協(xié)會(huì)組織合適的評(píng)審團(tuán)。
Input
第一行包含一個(gè)數(shù)字 K,代表測(cè)試文件包含了K 組資料。每一組測(cè)試資料的第一行包含兩個(gè)數(shù)字n 跟m(n≤100,m≤1000),代表有n 種材料,m 位評(píng)審員。為方便起見(jiàn),材料舍棄中文名稱而給予編號(hào),編號(hào)分別從1 到n。接下來(lái)的m 行,每行都代表對(duì)應(yīng)的評(píng)審員所擁有的兩個(gè)喜好,每個(gè)喜好由一個(gè)英文字母跟一個(gè)數(shù)字代表,如m1 代表這個(gè)評(píng)審喜歡第1 個(gè)材料透過(guò)滿式料理做出來(lái)的菜,而h2 代表這個(gè)評(píng)審員喜歡第2 個(gè)材料透過(guò)漢式料理做出來(lái)的菜。每個(gè)測(cè)試文件不會(huì)有超過(guò)50 組測(cè)試資料
Output
每筆測(cè)試資料輸出一行,如果不會(huì)發(fā)生沒(méi)有人能通過(guò)考核的窘境,輸出GOOD;否則輸出BAD(大寫(xiě)字母)。
Sample Input
23 4
m3 h1
m1 m2
h1 h3
h3 m2
2 4
h1 m2
m2 m1
h1 h2
m1 h2
Sample Output
GOOD
BAD
Solution
裸題,直接對(duì)食物$2-SAT$。
不會(huì)的話可能還得再重學(xué)一下……
Code
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #define N (2009) 5 using namespace std; 6 7 struct Edge{int to,next;}edge[N<<1]; 8 int DFN[N],Low[N],ID[N],vis[N],dfs_num,id_num; 9 int T,n,m,x[2],y[2]; 10 int head[N],num_edge,stack[N],top; 11 12 inline int read() 13 { 14 int x=0,w=1; char c=getchar(); 15 while (c<'0' || c>'9') {if (c=='-') w=-1; c=getchar();} 16 while (c>='0' && c<='9') x=x*10+c-'0', c=getchar(); 17 return x*w; 18 } 19 20 void add(int u,int v) 21 { 22 edge[++num_edge].to=v; 23 edge[num_edge].next=head[u]; 24 head[u]=num_edge; 25 } 26 27 void Clear() 28 { 29 memset(head,0,sizeof(head)); 30 memset(Low,0,sizeof(Low)); 31 memset(DFN,0,sizeof(DFN)); 32 memset(ID,0,sizeof(ID)); 33 num_edge=0; dfs_num=0; id_num=0; 34 } 35 36 void Tarjan(int x) 37 { 38 DFN[x]=Low[x]=++dfs_num; vis[x]=1; stack[++top]=x; 39 for (int i=head[x]; i; i=edge[i].next) 40 if (!DFN[edge[i].to]) 41 { 42 Tarjan(edge[i].to); 43 Low[x]=min(Low[x],Low[edge[i].to]); 44 } 45 else if (vis[edge[i].to]) 46 Low[x]=min(Low[x],DFN[edge[i].to]); 47 if (DFN[x]==Low[x]) 48 { 49 vis[x]=0; ID[x]=++id_num; 50 while (stack[top]!=x) 51 vis[stack[top]]=0, ID[stack[top--]]=id_num; 52 top--; 53 } 54 } 55 56 int main() 57 { 58 T=read(); 59 while (T--) 60 { 61 Clear(); 62 n=read(); m=read(); 63 for (int i=1; i<=m; ++i) 64 { 65 for (int j=0; j<=1; ++j) 66 { 67 char c=getchar(); 68 while (c<'a' || c>'z') c=getchar(); 69 x[j]=(c=='m'); y[j]=read(); 70 } 71 add(y[0]+(x[0]^1)*n,y[1]+x[1]*n); 72 add(y[1]+(x[1]^1)*n,y[0]+x[0]*n); 73 } 74 for (int i=1; i<=2*n; ++i) 75 if (!DFN[i]) Tarjan(i); 76 bool flag=1; 77 for (int i=1; i<=n; ++i) 78 if (ID[i]==ID[i+n]) flag=0; 79 if (flag) puts("GOOD"); 80 else puts("BAD"); 81 } 82 }轉(zhuǎn)載于:https://www.cnblogs.com/refun/p/10374734.html
總結(jié)
以上是生活随笔為你收集整理的BZOJ1823:[JSOI2010]满汉全席(2-SAT)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 多层 UIScrollView 嵌套滚动
- 下一篇: 面试系列-SpringMVC那些事(一)