匈牙利算法求最大匹配:
#include <iostream>
#include <vector>
#include <cstdio>
#include <string.h>
using namespace std;
vector<int> map[505];
int vis[505], lin[505];
inline int ReadInt()//优化接受int数,省时间,具体内容自己看懂,当成模板使用
{
char ch = getchar();
int data = 0;
while (ch < '0' || ch > '9')
ch = getchar();
do
{
data = data*10 + ch-'0';
ch = getchar();
} while (ch >= '0' && ch <= '9');
return data;
}
bool getnum(int i)//匈牙利算法
{
int j, r;
for (j = 0; j<map[i].size(); j++)
{
r=map[i][j];
if (!vis[r])
{
vis[r]=1;
if (!lin[r]||getnum(lin[r]))//如果没有匹配则直接执行下一步进行匹配,如果已经匹配,再从已匹配的点看看能不能让出这个点
{
lin[r]=i;
return 1;
}
// vis[j]=0;
}
}
return 0;
}
int main()
{
int T, n, m, num, i, x, y;
// freopen("in.txt", "r", stdin);
T=ReadInt();
while(T--)
{
n=ReadInt();//相当于:cin>>n
m=ReadInt();
while (m--)
{
x=ReadInt();
y=ReadInt();
map[x].push_back(y);
}
memset(lin, 0, sizeof(lin));//用来存放当前的匹配情况,寻找到增广路径后根据找到的点改变
num = 0;
for (i = 1; i<=n; i++)
{
memset(vis, 0, sizeof(vis));//每次寻找增广路径时初始化为0
if (getnum(i))
num++;
}
cout<<num<<endl;
for(i=1;i<=n;i++)//清空容器
map[i].clear();
}
return 0;
}