https://vjudge.net/contest/238849#problem/J
Each paratrooper lands at an intersection and can visit other intersections following the town streets.
每个伞兵可以到没有一个伞兵到过的路口,有向无环图,求最小覆盖路径,最小覆盖路径=节点数-最大匹配数
#include<stdio.h>
#include<string.h>
#include<string>
#include<queue>
#include<iostream>
#include<algorithm>
const int inf=0x3f3f3f3f;
using namespace std;
int g[123][123];
int vis[123];
int line[123];
int n,m;
int find1(int v)
{
for(int i=1; i<=n; i++)
{
if(vis[i]==0&&g[v][i])
{
vis[i]=1;
if(line[i]==-1||find1(line[i]))
{
line[i]=v;
return 1;
}
}
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(g,0,sizeof(g));
memset(vis,0,sizeof(vis));
memset(line,-1,sizeof(line));
scanf("%d%d",&n,&m);
for(int i=0; i<m; i++)
{
int x,y;
scanf("%d%d",&x,&y);
g[x][y]=1;
}
int ans=0;
for(int i=1; i<=n; i++)
{
memset(vis,0,sizeof(vis));
if(find1(i))
ans++;
}
printf("%d\n",n-ans);
}
}