解的是标准的匈牙利算法的模板,网络流还没看,这题好像也可以用网络流解
匈牙利算法不懂的参考博客: http://blog.csdn.net/niushuai666/article/details/7023101
/*
qq:1239198605
ctgu_yyf
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int n,m;//人数,对数;
vector<int>boy[520];//邻接表,保存匹配信息
bool use[520];//标记数组,保存匹配信息
int form[520];//父节点 (i号女生对应的男生编号)
bool match(int cur) //匹配函数
{
for(int i=0;i<boy[cur].size();i++) //遍历所有能与cur男生匹配的女生
{
if(!use[boy[cur].at(i)]) //判断该女生结点是否被判断过,没有进入
{
use[boy[cur].at(i)]=1; //将该女生标记为已经判断
if(form[boy[cur].at(i)]==-1||match(form[boy[cur].at(i)])) //如果该女生未被匹配,或者之前匹配该女生的男生可以匹配其他女生
{
form[boy[cur].at(i)]=cur; //将该女生匹配给这个男生
return 1; //成功返回1
}
}
}
return 0;
}
int hungary(){ //匈牙利算法
int count=0; //计数器
memset(form,-1,sizeof(form)); //保存女生对应的男生的编号,初始化为-1
for(int i=1;i<=n;i++) //遍历每个男生结点,与女生深搜匹配
{
memset(use,0,sizeof(use)); //匹配前先将标记数组清零,其作用是防止重复搜索某节点
count+=match(i);
}
return count;
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
boy[i].clear();
int start,end;
for(int i=0;i<m;i++)
{
cin>>start>>end;
boy[start].push_back(end);
}
int ans=hungary();
cout<<ans<<endl;
}
return 0;
}