由于最小路径覆盖数
=
=
= 原图G的顶点数
−
-
− 二分图的最大匹配数
所以,套模板即可。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int ls[10010],v[10010],link[10010];
int T,n,m,x,y,tot,ans;
struct node
{
int y,next;
}a[10010];
void add(int x,int y)
{
a[++tot].y=y;
a[tot].next=ls[x];
ls[x]=tot;
}
int dfs(int x)
{
for(int i=ls[x]; i; i=a[i].next)
{
int y=a[i].y;
if(!v[y])
{
v[y]=1;
int fa=link[y];
link[y]=x;
if(fa==0||dfs(fa))
return 1;
link[y]=fa;
}
}
return 0;
}
int main()
{
cin>>T;
while(T--)
{
cin>>n>>m;
for(int i=1; i<=m; i++)
{
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i=1; i<=n; i++)
{
memset(v,0,sizeof(v));
if(dfs(i))
ans++;
}
cout<<n-ans<<endl;
ans=0,tot=0;
memset(link,0,sizeof(link));
memset(ls,0,sizeof(ls));
}
return 0;
}