就是一开始dfs的时候vis[u]=1,wa了一发,脑残。
思路不懂的可以去看我置顶的二分图性质
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int f[105][105],n,m,vis[105],bl[105];
void make(){
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];
}
}
}
}
int dfs(int u){
for(int i=1;i<=n;i++)
if(!vis[i]&&f[u][i]){
vis[i]=1;
if(!bl[i]||dfs(bl[i])){
bl[i]=u;return 1;
}
}return 0;
}
int main(){
scanf("%d%d",&n,&m);
for(int a,b,i=1;i<=m;i++){
scanf("%d%d",&a,&b);
f[a][b]=1;
}make();
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)vis[j]=0;
ans+=dfs(i);
}
printf("%d",n-ans);
return 0;
}