Description
Input
Output
最多可选多少景点
Sample Input
7 6
1 2
2 3
5 4
4 3
3 6
6 7
Sample Output
2
HINT
Source
Ctsc2008 River & ural 1533. Fat Hobbits
Source里都说了和CTSC2008祭祀一样…
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 210
using namespace std;
int n,m,top;
int map[MAXN][MAXN],Link[MAXN];
bool vis[MAXN];
int ans;
struct edge
{
int to;
edge *next;
}e[MAXN*MAXN],*prev[MAXN];
void insert(int u,int v)
{
e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top];
}
bool dfs(int x)
{
for (edge *i=prev[x];i;i=i->next)
if (!vis[i->to])
{
vis[i->to]=1;
if (!Link[i->to]||dfs(Link[i->to]))
{
Link[i->to]=x;return 1;
}
}
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
int x,y;scanf("%d%d",&x,&y);
map[x][y]=1;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
for (int k=1;k<=n;k++)
map[i][j]|=map[i][k]&&map[k][j];
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j&&map[i][j]) insert(i,j);
for (int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if (dfs(i)) ans++;
}
printf("%d\n",n-ans);
}