计算二分图的最小点覆盖,使用匈牙利算法,最小点覆盖数 = 最大匹配数。
#include <iostream>
using namespace std;
const int MAXN = 105;
//机器对照情况数组,结点匹配数组,结点访问数组
int match[MAXN][MAXN], use[MAXN], vis[MAXN];
int n, m, k;
//查找从x出发的增广路径
int find(int x)
{
for (int i = 1; i <= m; i++) //遍历x的邻接点
{
if (match[x][i] && !vis[i]) //x和i之间有对应且i未被访问
{
vis[i] = 1;
//i未匹配或者从i的匹配点出发能找到增广路径
if (use[i] == 0 || find(use[i]) == 1)
{
use[i] = x;
return 1;
}
}
}
return 0;
}
int main()
{
while (cin >> n)
{
if (n == 0)
break;
cin >> m >> k;
memset(match, 0, sizeof(match));
int t, u, v;
for (int i = 0; i < k; i++)
{
cin >> t >> u >> v;
match[u][v] = 1;
}
int sum = 0;
memset(use, 0, sizeof(use));
for (int i = 1; i <= n; i++)
{
memset(vis, 0, sizeof(vis));
if (find(i))
++sum;
}
cout << sum << endl;
}
return 0;
}
继续加油。