#include<bits/stdc++.h> using namespace std; #define N 120 int n,m,x,y,tot,ans,f[N][N],head[N],pre[N]; bool vis[N]; struct edge{int v,nxt;}e[N*N]; void add(int x,int y){e[++tot].v=y; e[tot].nxt=head[x]; head[x]=tot;} bool dfs(int x){ for (int i=head[x];i;i=e[i].nxt){ if (!vis[e[i].v]){ vis[e[i].v]=1; if (!pre[e[i].v] || dfs(pre[e[i].v])){pre[e[i].v]=x; return 1;} } } return 0; } int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=m;i++){ scanf("%d%d",&x,&y); f[x][y]=1; } for (int k=1;k<=n;k++) for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) f[i][j]|=f[i][k]&f[k][j]; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (f[i][j]==1) add(i,j); for (int i=1;i<=n;i++){ memset(vis,0,sizeof vis); if (dfs(i)) ans++; } printf("%d\n",n-ans); return 0; }
|