/*
一开始大意了 以为和bzoj上的祭祀是一样的(毕竟样例都一样)
这里不知相邻的点可以相互到达 间接相连的也可以到达
所以floyed先建立一下关系 再跑最大独立集
下面贴一下95 和 100的代码
(认真读题保平安)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 210
#define maxm 30010
using namespace std;
int n,m,head[maxn],num,ans,match[maxn];
bool f[maxn];
struct node
{
int u,v,pre;
}e[maxm];
void Add(int from,int to)
{
num++;
e[num].u=from;
e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
int Dfs(int s)
{
for(int i=head[s];i;i=e[i].pre)
{
int v=e[i].v;
if(f[v]==)
{
f[v]=;
if(match[v]==||Dfs(match[v]))
{
match[v]=s;
return ;
}
}
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);int x,y;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
Add(x,y);
}
for(int i=;i<=n;i++)
{
memset(f,,sizeof(f));
ans+=Dfs(i);
}
int p=n-ans;
printf("%d\n",p);
return ;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 210
using namespace std;
int n,m,g[maxn][maxn],ans,match[maxn];
bool f[maxn];
int Dfs(int s)
{
for(int i=;i<=n;i++)
if(f[i]==&&g[s][i]==)
{
f[i]=;
if(match[i]==||Dfs(match[i]))
{
match[i]=s;
return ;
}
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
int x,y;ans=n;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
g[x][y]=;
}
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
g[i][j]=g[i][j]||(g[i][k]&&g[k][j]);
for(int i=;i<=n;i++)
{
memset(f,,sizeof(f));
ans-=Dfs(i);
}
printf("%d\n",ans);
return ;
}