#include<iostream>
#include<cstring>
using namespace std;
#define N 505
int a[N][N],visit[N],link[N];
int k,n,m;
int dfs(int i)
{
for(int j=1; j<=m; j++)
{
if(a[i][j]&&!visit[j]) //路口沒有訪問
{
visit[j]=1;
if(link[j]==-1||dfs(link[j]))//如果該點沒有與其他點關聯或者 與之關聯的點 由遞歸可以找到其他點與之相連
{
link[j]=i;
return 1;
}
}
}
return 0;
}
int hungary()
{
int sum=0;
memset(link,-1,sizeof(link));
for(int i=1; i<=m; i++)
{
memset(visit,0,sizeof(visit));
if(dfs(i))
sum++;
}
return sum;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>m;
memset(a,0,sizeof(a));
cin>>k;
while(k--)
{
int x,y;
cin>>x>>y;
a[x][y]=1;
}
cout<<m-hungary()<<endl;
}
關於二分圖其他問題可以查看我其他博客