國王手下有m個大臣,他們有一天對國王要處理的n件事務進行投票。每個大臣可以對兩件事務贊成或反對,格式如下:x c_x y c_y表示這個大臣對事務x的態度為c_x,對事務y的態度為c_y。如果國王的決定和某個大臣的兩個意見都不同,那麼這個大臣就會離開國王。小c認為不能讓任何乙個大臣離開國王,否則國王就無法正常地處理自己的事務。請你幫助小c做個決定。
如果小c無論如何都只能讓至少乙個大臣離開國王,則輸出「impossible」(不含雙引號),否則輸出乙個長度為n的字串,如果第i件事務必須贊成,則第i個字元為「y」;如果第i件事務必須反對,則第i個字元為「n」,否則第i個字元為「?」。
x, y為整數,c_x, c_y為「y」(表示贊成)或「n」(表示反對)
對於50%的資料,1<=n<=10,1<=m<=40;
對於全部的資料,1<=n<=1000,1<=m<=4000。
這題一開始並沒有什麼想法,各種暴力都套不進。。。
後來看了幾篇部落格,才知道其實很簡單
對於一對[x,cx,y,cy]而言,你要使得大臣不離開至少要有乙個滿足
則, 舉例一種情況:
1 y 2 y
這時候,你要留下大臣,就要滿足1 y 或者 2 y
我們可以這樣理解
對1是n時對2必定要是y
對2是n時對1必定要是y
這時候其他的同理
我們就可以將這些關係建成一條條邊
然後列舉每乙個事務的y/n 兩種狀態,沿著邊跑,
判斷是否當你對i持y意見時,你是否必定必須要對i持n意見!
就是你i選了y以後那些邊對應的意見就要相對應的做出選擇,看這些選擇時候能使得事務i必定出現n
你對i持n意見時,同理
但2個意見都沒衝突時,輸出?
y沒n有,輸出y
n沒y有,輸出n
都有衝突,哇!impossible
這或許就是傳說中的2-sat
const
maxn=4001;
var a:array[0..maxn,1..2] of longint;
go,next:array [0..2*maxn] of longint;
cp,list:array [0..2001] of longint;
n,m,i,j,rp,p,q:longint;
check,rp1,rp2:boolean;
ans:ansistring;
x1,x2:char;
procedure
add(x,y:longint);
begin
inc(p);
go[p]:=y;
next[p]:=list[x];
list[x]:=p;
end;
procedure
work
(x:longint);
var i:longint;
begin
ifnot(rp1) then
exit;
if x=rp then
begin
rp1:=false;
exit;
end;
cp[x]:=q;
i:=list[x];
while i>0
dobegin
if cp[go[i]]<>q then work(go[i]);
ifnot(rp1) then
exit;
i:=next[i];
end;
end;
begin
readln(n,m);
for i:=1
to m do
begin
readln(a[i,1],x1,x1,a[i,2],x2,x2);
if (x1='y') and (x2='n') then
begin
add(a[i,1]+n,a[i,2]+n);
add(a[i,2],a[i,1]);
end;
if (x1='y') and (x2='y') then
begin
add(a[i,1]+n,a[i,2]);
add(a[i,2]+n,a[i,1]);
end;
if (x1='n') and (x2='y') then
begin
add(a[i,1],a[i,2]);
add(a[i,2]+n,a[i,1]+n);
end;
if (x1='n') and (x2='n') then
begin
add(a[i,1],a[i,2]+n);
add(a[i,2],a[i,1]+n);
end;
end;
fillchar(cp,sizeof(cp),0);
ans:='';
q:=0;
for i:=1
to n do
begin
inc(q);
rp1:=true;
rp:=n+i;
work(i);
rp2:=rp1;
inc(q);
rp1:=true;
rp:=i;
work(n+i);
ifnot(rp1) and
not(rp2)
then
begin
writeln('impossible');
halt;
end;
if (rp1) and (rp2) then ans:=ans+'?'
else
if rp2 then ans:=ans+'y'
else ans:=ans+'n';
end;
writeln(ans);
end.
379 完全平方數 BFS
給定正整數 n,找到若干個完全平方數 比如 1,4,9,16,使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。示例 1 輸入 n 12 輸出 3 解釋 12 4 4 4.示例 2 輸入 n 13 輸出 2 解釋 13 4 9.from collections import deque b...
火影忍者379話最新情報
火影忍者379話情報 從漫畫一開始,佩因的一句話就讓人驚奇。從管子逃走了麼?上一話自來也就得出結論,佩印的視覺只是共享,並沒有具備像白眼一樣近乎360度視角的能力,火影忍者379情報 火影忍者379情報圖 火影忍者379話 火影忍者第379話 但是當時三個人都是背對管子的,怎麼會知道自來也是從管子逃...
jzoj P1330 迎接儀式
給出乙個不和諧的佇列,用 j 替代 教 z 替代 主 而乙個 j 與 z 組成的序列則可以描述當前的佇列。為了讓教主看得盡量舒服,你必須調整佇列,使得 jz 子串盡量多。每次調整你可以交換任意位置上的兩個人,也就是序列中任意位置上的兩個字母。而因為教主馬上就來了,時間僅夠最多作k次調整 當然可以調整...