#include <stdio.h>
#define N 2005
int n, m, i, j, k, a, b, ans;
int h[N], v[N], s[N][N];
struct AB{
    int a, b, n;
} d[N];
void dfs(int a, int c){
    int b, i;
    if(v[a] == k) return;
    v[a] = k;//时间戳
    if(c > 1){
        ans += s[k][a]^1;
        s[k][a] = 1;//加过不再加
    }//深度至少为2才需要加边
    for(i=h[a]; i; i=d[i].n){
        b = d[i].b;
        dfs(b, c+1);
    }
}
int main(){
    scanf("%d%d", &n, &m);
    for(i=1; i<=m; i++){
        scanf("%d%d", &a, &b);
        s[a][b] = 1;
        d[i].a = a, d[i].b = b;
        d[i].n = h[a], h[a] = i;
    }
    for(k=1; k<=n; k++){
        dfs(k, 1);
    }//依次统计每个点需要增加的边
    printf("%d\n", ans);
    return 0;
}

作者 crxis

发表回复