求二分匹配最小路劲覆盖问题,最小路径覆盖=节点数-最大匹配数;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 1100
int n,m;
int used[N],link[N],mat[N][N];
int dfs(int t)
{
int i;
for(i=1;i<=n;i++)
{
if(used[i]==0&&mat[t][i])
{
used[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=t;
return 1;
}
}
}
return 0;
}
int main()
{
int t,i,a,b;
scanf("%d",&t);
while(t--)
{
memset(link,-1,sizeof(link));
memset(mat,0,sizeof(mat));
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
mat[a][b]=1;
}
int num=0;
for(i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
if(dfs(i))
num++;
}
printf("%d\n",n-num);
}
return 0;
}