Byteazar 有 N 个小猪存钱罐. 每个存钱罐只能用钥匙打开或者砸开. Byteazar 已经把每个存钱罐的钥匙放到了某些存钱罐里. Byteazar 现在想买一台汽车于是要把所有的钱都取出来. 他想尽量少的打破存钱罐取出所有的钱,问最少要打破多少个存钱罐.
不多说了,并查集求连通块个数即可。
CODE:
var
fa:array[0..1000000] of longint;
n,x,a,b,ans,i:longint;
function find(x:longint):longint;
begin
if fa[x]=x then exit(x);
find:=find(fa[x]);
fa[x]:=find;
end;
begin
readln(n); ans:=0;
for i:=1 to n do fa[i]:=i;
for i:=1 to n do
begin
readln(x);
a:=find(i);
b:=find(x);
if a<>b then
fa[b]:=a;
end;
for i:=1 to n do
if fa[i]=i then inc(ans);
writeln(ans);
end.