【usaco 2013 Mar Bronze】种类分配

题目描述

题目:

农夫约翰有N只奶头,这N只奶牛分别属于三个种类:A,B,C。但是不幸的是,约翰忘记了每只奶牛分别属于哪个种类了。他仅仅只记得的K个奶牛之间的关系。例如,他记得奶牛1和奶牛2是同一种类,或者奶牛1和奶牛5是不同种类的。

问题描述:

给定这K个关系,请帮助约翰计算这N只奶牛可能的种类分布情况共有多少种。(当K个关系本身就是矛盾的时候,答案是0)。



搜的时候判断当前点是否符合同一种类必须在一起,不同种类不能在一起。
var
  f:array[0..15,0..15] of longint;
  b,t:array[0..100] of longint;
  k,i,j,n,ans,x,y,l:longint;
  ch:char;

function check(x:longint):boolean;
var
  i:longint;
begin
  check:=false;
  for i:=1 to l do
    if t[i]=x then exit(true);
end;

function tr(x,p,s:longint):boolean;
var
  i:longint;
begin
  tr:=false;
  for i:=1 to x do
    if ((f[t[i],p]=1) and (b[i]=s)) or ((f[t[i],p]=2) and (b[i]<>s)) then exit(true);
end;

procedure dfs(dep:longint);
var
  i:longint;
begin
  if dep>l then begin inc(ans);exit; end;
  for i:=1 to 3 do
     if not tr(dep-1,t[dep],i) then
       begin
         inc(j);
         b[j]:=i;
         dfs(dep+1);
         b[j]:=0;
         dec(j);
       end;
end;

begin
  assign(input,'assign.in'); reset(input);
  assign(output,'assign.out');rewrite(output);
  readln(n,k);
  l:=0; j:=0;
  for i:=1 to k do
    begin
      readln(ch,x,y);
      if ch='D' then
        begin
          f[x,y]:=1;
          f[y,x]:=1;
        end
      else
        begin
          f[x,y]:=2;
          f[y,x]:=2;
        end;
       if not check(x) then begin inc(l);t[l]:=x;end;
       if not check(y) then begin inc(l);t[l]:=y;;end;
    end;
  dfs(1);
  for i:=1 to n-l do
    ans:=ans*3;
  writeln(ans);
  close(input);close(output);
end.


你可能感兴趣的:(深搜)