如果数字i不在环中,那么先手选择大于n的数字k,k轮操作后,结果必是环中数字。
如果数字i在环中,后手总可以选择合适的起点,使得最终停在i。
拓扑排序,统计不在环中的数字数量即可,没入队的均在环中。
#include <stdio.h>
#define N 200050
int n, m, i, j, k, a, b, h[N], r[N], q[N];
struct AB{
int a, b, n;
} d[N];
int main(){
scanf("%d", &n);
for(i=1; i<=n; i++){
scanf("%d", &k);
d[i].a = i, d[i].b = k, r[k]++;
d[i].n = h[i], h[i] = i;
}
for(i=1; i<=n; i++){
if(r[i] == 0) q[++j] = i;
}
for(i=1; i<=j; i++){
a = q[i];
for(k=h[a]; k; k=d[k].n){
b = d[k].b;
if(--r[b] == 0) q[++j] = b;
}
}//不在环中有j个,环中有n-j个
printf("%d\n", n-j);
return 0;
}