【usaco 2013 Mar Bronze】种类分配

来源:互联网 发布:floyd算法 路径 编辑:程序博客网 时间:2024/05/18 03:51
题目:

农夫约翰有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.


3 0
原创粉丝点击