【usaco 2013 Mar Bronze】种类分配

题目:

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


  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值