参考题解,讲得很详细:
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
with e[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.