如果数字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;
}

作者 crxis

发表回复