我们可以贪心的分析,每个点的入度如果是0,那么这个点不可能
被用来更新答案,那么我们每次找入度为0的点,将他去掉,如果他连的
点没有被更新过答案,那么更新答案,去掉该点,环的时候最后处理就行了
/************************************************************** Problem: 3037 User: BLADEVIL Language: Pascal Result: Accepted Time:1672 ms Memory:12920 kb ****************************************************************/ //By BLADEVIL var n, ans, cnt :longint; other, sum :array[0..1000020] of longint; flag :array[0..1000020] of boolean; que :array[0..1000020] of longint; procedure init; var i :longint; begin readln(n); for i:=1 to n do begin read(other[i]); inc(sum[other[i]]); end; end; procedure main; var h, t, cur :longint; i, j :longint; begin t:=0; for i:=1 to n do if sum[i]=0 then begin inc(t); que[t]:=i; end; h:=1; while h<=t do begin cur:=que[h]; inc(h); if (not flag[cur]) and (not flag[other[cur]]) then begin inc(ans); flag[other[cur]]:=true; dec(sum[other[other[cur]]]); if sum[other[other[cur]]]=0 then begin inc(t); que[t]:=other[other[cur]]; end; end; flag[cur]:=true; end; for i:=1 to n do if not flag[i] then begin cnt:=1; flag[i]:=true; j:=i; while other[j]<>i do begin flag[other[j]]:=true; inc(cnt); j:=other[j]; end; inc(ans,cnt div 2); end; writeln(ans); end; begin init; main; end.