- 有向无环图的最小路径可重复点覆盖。如果要构造方案的话,采取动态更新、逐步调整的方法,先假设所有的终点构成一组方案,如果不满足条件的话就沿着路径向上调整
#include <bits/stdc++.h>
using namespace std;
vector<int>a[405];
int m[405];
bool v[405],f[205][205][205];
bool dfs(int n1)
{v[n1]=true;for(int i=0;i<a[n1].size();i++){if(!m[a[n1][i]]||v[m[a[n1][i]]]==false&&dfs(m[a[n1][i]])){m[a[n1][i]]=n1;return true;}}return false;
}
int n,M;
void floyd()
{for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){f[k][i][j]=f[k-1][i][j]|(f[k-1][i][k]&f[k-1][k][j]);if(k==n&&f[k][i][j]){a[i].push_back(j+n);}}}}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cin>>n>>M;for(int i=1;i<=M;i++){int u,v;cin>>u>>v;f[0][u][v]=true;}floyd();int ans=0;for(int i=1;i<=n;i++){memset(v,false,sizeof(v));ans+=(dfs(i)==true);}cout<<n-ans<<endl;return 0;
}