【usaco 2013 feb Bronze】信息传递

题目描述

题目:
   农夫约翰的奶牛通常是按1到N进行编号的,奶牛们相互之间有一种特殊的信息传输方式。在信息传递的过程中,每只奶牛的信息最多传递到另一只奶牛,对于奶牛i,Fi表示他要传递信息的那只奶牛的编号,这里i和Fi肯定是不同的,如果Fi是0,则表示奶牛i没有要传递信息给其他的奶牛。
   不幸的是,奶牛们知道了这种传递信息的方式可能会导致一个死循环。如果一个奶牛传递信息最终会导致一个死循环,那么我们就说这只奶牛在死循环里面。
问题描述:
    请帮助奶牛们计算有多少头奶牛没有在死循环里面。

模拟每一头奶牛的传递,用布尔型数组把传过的编号标记,传到标记过的就是死循环。

const
  maxn=1000;
var
  a:array[0..maxn] of longint;
  f:array[0..maxn] of boolean;
  ans,n,i,k:longint;
begin
  assign(input,'relay.in'); reset(input);
  assign(output,'relay.out');rewrite(output);
  readln(n);
  for i:=1 to n do
    readln(a[i]);
  for i:=1 to n do
    begin
      fillchar(f,sizeof(f),false);
      if a[i]=0 then
        begin
          inc(ans);
          continue;
        end;
      k:=i;
      inc(ans);
      while a[k]<>0 do
        begin
          f[k]:=true;
          k:=a[k];
          if f[k] then
            begin
              dec(ans);
              break;
            end;
        end;
    end;
  writeln(ans);
  close(input);close(output);
end.

你可能感兴趣的:(模拟)