題目傳送門:【bzoj 1823】
題目大意:……為了招收新進的廚師進入世界滿漢全席協會,近日該協會將舉辦滿漢全席大賽。協會將派遣許多會員當作評委,為的就是要在參賽的廚師之中,找到滿漢料理界的明日之星。每位參賽的選手可以得到 n 種菜品材料,選手可以自由選擇用滿式或是漢式料理將該材料當成菜餚。共有 m 位評審員分別把關,每一位評審員都有兩種喜歡的菜品種類。只要參賽者能在評審員所喜愛的兩種菜品中,做出任意乙個符合評審喜好的菜品即可通過該評委的審查。但大會後來發現,在這樣的制度下如果材料選擇跟派出的評審員沒有特別安排好的話,所有的參賽者最多只能通過部分評委的審查而不是全部,所以可能會發生沒有人通過考核的情形。所以大會希望你能寫乙個程式來判斷,所選出的 m 位評審,會不會發生沒有人通過考核的窘境,以便協會組織合適的評審團。
輸入共 k 組資料,每組資料第一行為兩個整數 n , m,代表有 n 種菜品,m 位評審員(k ≤ 50 , n ≤ 100 , m ≤ 1000)。接下來的 m 行,每行都代表對應的評審員所擁有的兩個喜好菜品,每個喜好菜品由乙個英文本母跟乙個數字代表(例如:m1 , h2)。每組資料輸出一行,如果不會發生沒有人通過考核的窘境,輸出 good;否則輸出bad(大寫字母)。
題目分析:
一道 2-sat 的模板題。想必看明白了 2-sat 演算法的同學在認真讀完這道題之後就應該能想到吧。
對於每一種菜品,我們把它拆成兩個點 h 和 m,代表它是被做成漢式菜或者是滿式菜。顯然一種菜品只能有一種選擇。然後對於輸入中給出的關係,由於兩種菜品(a , b)中至少需要選擇乙個,所以我們建立(a』 -> b),(b』 -> a)兩條邊表示兩種菜品至少要有一種滿足評審員的喜好風格。之後按照常規跑 2-sat 即可。
下面附上**:
[cpp]view plain
copy
print?
#include
#include
#include
#include
#include
using
namespace std;
const
int mxn = 105,mxm = 1005;
struct edge;
edge edge[mxn * mxn * 2];
int n,m,head[mxn * 2],now = 0;
int dfn[mxn * 2],low[mxn * 2],cnt = 0,_index = 0,belong[mxn * 2];
stack s;
bool ins[mxn * 2];
int istype_man(int c)
void adde(int u,int v)
void tarjan(int u) else
if (ins[v] && dfn[v] < low[u])
low[u] = dfn[v];
} if (dfn[u] == low[u])while (tmp != u);
} }
void _init()
int main()
for (int i = 1;i <= 2 * n;i++)
bool reach = false;
for (int i = 1;i <= n;i++)
} if (!reach) printf(「good\n」);
else printf(「bad\n」);
_init();
} return 0;
}
bzoj1823 JSOI2010 滿漢全席
題目 2 sat裸題,最近剛剛學了這個東西,畢竟noi考過呀。建邊就是考慮限制條件如果x選什麼,y就一定選什麼之類的,然後跑一遍tarjan縮點,如果存在乙個點和它的相反點在乙個強連通分量中,那麼就沒解,否則一定有解。至於輸出乙個解,只要看mark的大小就好了,選小的就好了。include defi...
bzoj1823 JSOI2010 滿漢全席
description 滿漢全席是中國最豐盛的宴客菜餚,有許多種 同的材 透過滿族或是漢族的 方式,呈現在 繁多的菜色之中。由於菜色眾多而繁雜,只有極少 博學多聞技藝高超的廚師能夠做出滿漢全席,而能夠烹飪出經過專家認證的滿漢全席,也是中國廚師最大的榮譽之一。世界滿漢全席協會是由能夠 滿漢全席的專家廚...
BZOJ 1823 JSOI2010 滿漢全席
題目在這裡呀!真不知道這道題說了這麼多有什麼用。就是每種菜有m和h兩種,然後只能取其中乙個,然後有m條限制,表示取了前乙個就不能取後乙個了,然後求可不可行?看懂題意就是很裸的2 sat了 雖然我題意說的一點都不清楚 suplex include include include include inc...