题目:
农夫约翰有N只奶头,这N只奶牛分别属于三个种类:A,B,C。但是不幸的是,约翰忘记了每只奶牛分别属于哪个种类了。他仅仅只记得的K个奶牛之间的关系。例如,他记得奶牛1和奶牛2是同一种类,或者奶牛1和奶牛5是不同种类的。
问题描述:
给定这K个关系,请帮助约翰计算这N只奶牛可能的种类分布情况共有多少种。(当K个关系本身就是矛盾的时候,答案是0)。
农夫约翰有N只奶头,这N只奶牛分别属于三个种类:A,B,C。但是不幸的是,约翰忘记了每只奶牛分别属于哪个种类了。他仅仅只记得的K个奶牛之间的关系。例如,他记得奶牛1和奶牛2是同一种类,或者奶牛1和奶牛5是不同种类的。
问题描述:
给定这K个关系,请帮助约翰计算这N只奶牛可能的种类分布情况共有多少种。(当K个关系本身就是矛盾的时候,答案是0)。
题解:
搜索。
代码:
var
n,m,ans:longint;
a,b:array[0..15] of longint;
c:array[1..15] of boolean;
f:array[1..15,1..15] of longint;
function main(x,y,z:longint):boolean;
var
i:longint;
begin
for i:=1 to x do
if ((f[b[i],y]=1)and(z<>a[i]))or((f[b[i],y]=2)and(z=a[i])) then
exit(false);
exit(true);
end;
procedure dfs(t:longint);
var
i:longint;
begin
if t>b[0] then
begin
inc(ans);
exit;
end;
for i:=1 to 3 do
if main(t-1,b[t],i) then
begin
inc(a[0]);
a[a[0]]:=i;
dfs(t+1);
a[a[0]]:=0;
dec(a[0]);
end;
end;
procedure init;
var
i,x,y:longint;
s:char;
begin
readln(n,m);
fillchar(c,sizeof(c),true);
for i:=1 to m do
begin
readln(s,x,y);
if c[x] then
begin
c[x]:=false;
inc(b[0]);
b[b[0]]:=x;
end;
if c[y] then
begin
c[y]:=false;
inc(b[0]);
b[b[0]]:=y;
end;
if s='S' then
begin
f[x,y]:=1;f[y,x]:=1;
end
else
begin
f[x,y]:=2;f[y,x]:=2;
end;
end;
end;
var
i:longint;
begin
assign(input,'assign.in'); reset(input);
assign(output,'assign.out'); rewrite(output);
init;
dfs(1);
for i:=1 to n-b[0] do
ans:=ans*3;
writeln(ans);
close(input); close(output);
end.