【usaco 2013 feb Bronze】信息传递

来源:互联网 发布:prototype.js 1.6下载 编辑:程序博客网 时间:2024/05/14 23:05

题目描述

题目:
   农夫约翰的奶牛通常是按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.

0 0