做的第一道2-sat的題emmm。。。
由題意可知,每個評委的兩個要求中,至少要滿足乙個,
因此,如果有乙個不滿足,那另乙個必定要滿足
所以對於每道菜我們拆兩個點,乙個是滿族口味,乙個是漢族口味,
如果我們要不滿足滿族口味,也就意味著我們要做漢族口味
所以照著每位評委的菜連邊即可
比如說乙個評委要求m1,m2,
那麼不做m1就意味著做h1,所以h1 --- > m2
同理,h2 --- > m1
然後判斷乙個菜的滿族做法和漢族做法是不是在同乙個強連通分量裡,
因為乙個菜不可能同時做兩種做法,所以如果在同乙個強連通分量裡的話,就是不合法的
連邊應該還有更方便的寫法,只不過我懶得想就手動模擬了
1 #include2view codeusing
namespace
std;
3#define r register int
4#define ac 450
5#define ac 4500
6#define d printf("line in %d\n",__line__);
7int
t, n, m;
8int
dfn[ac], low[ac],belong[ac],cnt;
9int
date[ac], next[ac], head[ac], tot;
10int
q[ac], top, timer;
11char c1[5], c2[5
];12
bool
z[ac];
1314 inline void add(int f, int
w)15
1920 inline void upmin(int &a, int
b)21
24//
拆成4個點,i --- > 選漢式,i+n --- >選滿式
25void
pre()
2642
else
//不滿足x1,滿足x2,此時x1是h,所以加
4347
if(c2[1] == '
m') //
滿足x1,不滿足x2,此時x2是'm',所以不加
4852
else
//滿足x1,不滿足x2,此時x2是h,所以加
5357
} 58}
5960
void tarjan(int
x)61
73else
if(z[now]) upmin(low[x], low[now]);74}
75if(dfn[x] ==low[x])
7683 }//
--放後面可以保證top不被忽略84}
8586
void
work()
87103
//for(r i=1;i<=2*n;i++) printf("%d ",belong[i]);
104if(!flag) printf("
good\n");
105else printf("
bad\n");
106}
107}
108109
intmain()
110
JSOI2010 滿漢全席
time limit 10 sec memory limit 64 mb submit status discuss 滿漢全席是中國最豐盛的宴客菜餚,有許多種 同的材 透過滿族或是漢族的 方式,呈現在 繁多的菜色之中。由於菜色眾多而繁雜,只有極少 博學多聞技藝高超的廚師能夠做出滿漢全席,而能夠烹飪出...
JSOI2010 滿漢全席
洛谷 p4171 傳送門 bzoj1823 傳送門 2 sat裸題。簡單講一下2 sat 首先把題目給出的種種限制轉換為乙個圖。以這道題來說,每種菜看作是兩個點,乙個點代表做成漢式,另乙個代表做成滿式。然後考慮約束條件 比如 評委要求a做成漢式,b做成滿式。那麼如果a做成滿式,b就一定是滿式 同理,...
JSOI2010 滿漢全席 2 SAT
傳送門 題目鏈結 滿漢全席 題目描述 滿漢全席是中國最豐盛的宴客菜餚,有許多種 同的材 透過滿族或是漢族的 方式,呈現在 繁多的菜色之中。由於菜色眾多而繁雜,只有極少 博學多聞技藝高超的廚師能夠做出滿漢全席,而能夠烹飪出經過專家認證的滿漢全席,也是中國廚師最大的榮譽之一。世界滿漢全席協會是由能夠 滿...