简单的并查集的应用,经典题目:
{ Author:wzx961008
Problem:POJ 1182-eat
Verdict:Accepted
Language:PASCAL
Run Time:0.188s
AC Date:2011-4-19
}
var i,n,k,d,x,y,ans,gx,fx,gy,fy:longint;
f,g:array[1..50000]of longint;
function find(i:longint):longint;
begin
if f[i]<>i then f[i]:=find(f[i]);
exit(f[i]);
end;
function getrel(i:longint):longint;
begin
if f[i]<>i then g[i]:=(getrel(f[i])+g[i]) mod 3;
exit(g[i]);
end;
begin
readln(n,k);
for i:=1 to n do f[i]:=i;
for i:=1 to k do begin
readln(d,x,y); dec(d);
if (x>n)or(y>n) then begin inc(ans); continue; end;
gx:=getrel(x); fx:=find(x); gy:=getrel(y); fy:=find(y);
if fx<>fy then begin
f[fx]:=fy;
g[fx]:=(d-gx+gy+3) mod 3;
end else if (gx-gy+3) mod 3<>d then inc(ans);
end;
writeln(ans);
end.