(未完成)1182食物链

来源:互联网 发布:发烧碟推荐知乎 编辑:程序博客网 时间:2024/05/29 14:51
参考题解,讲得很详细:
http://www.cnblogs.com/Missa/archive/2012/07/22/2604220.html
type
  data=record
    d,x,y:longint;
  end;
var
  n,k,i,ans,x,y:longint;
  e:array[1..100000] of data;
  f:array[1..50000] of longint;
  r:array[1..50000] of 0..2;
function findset(x:longint):longint;
begin
  if x<>f[x] then
    begin
     f[x]:=findset(f[x]);
     r[x]:=(r[x]+r[f[x]]);
    end;
  exit(f[x]);
end;
procedure union(x,y,d:longint);
begin
  x:=findset(x);
  y:=findset(y);
  f[x]:=y;
  r[x]:=(r[y]-r[x]+3+d)mod 3;
end;
begin
  fillchar(f,sizeof(f),0);
  read(n,k);
  for i:=1 to k do
    begin
      withe[i] do
       read(d,x,y);
    end;
  for i:=1 to n do
    begin
     f[i]:=i;
     r[i]:=0;
    end;
  ans:=0;
  for i:=1 to k do
    begin
      if(e[i].x>n) or (e[i].y>n) or ((e[i].d=2) and (e[i].x=e[i].y))then
       inc(ans)
     else
       begin
         x:=findset(e[i].x);
         y:=findset(e[i].y);
         if x=y then
           if(r[e[i].x]-r[e[i].y]+3) mod 3<>e[i].d-1 then
           inc(ans)
           else
            union(e[i].x,e[i].y,e[i].d-1);
       end;
    end;
  writeln(ans);
end.
原创粉丝点击