#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
#define N 510
int vis[N], match[N], maps[N][N], n, ans;
void floyd()
{
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(maps[i][k] && maps[k][j])
maps[i][j] = 1;
}
bool Find(int u)
{
for(int i=1; i<=n; i++)
{
if(!vis[i] && maps[u][i])
{
vis[i] = 1;
if(!match[i] || Find(match[i]))
{
match[i] = u;
return true;
}
}
}
return false;
}
int main()
{
int a, b, m;
while(scanf("%d%d", &n, &m), m+n)
{
memset(maps, 0, sizeof(maps));
for(int i=0; i<m; i++)
{
scanf("%d%d", &a, &b);
maps[a][b] = 1;
}
floyd();
ans = 0;
memset(match, 0, sizeof(match));
for(int i=1; i<=n; i++)
{
memset(vis, 0, sizeof(vis));
if(Find(i))
ans++;
}
printf("%d\n", n - ans);
}
return 0;
}
Treasure Exploration POJ - 2594
原文:https://www.cnblogs.com/QingyuYYYYY/p/12431059.html