本题与杭电OJ 1150解法基本相同,求二分图的最小边覆盖数。最小边覆盖 = 结点数 - 最大匹配数,使用匈牙利算法即可。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1000;
int edge[MAXN][MAXN]; //各结点之间的连接关系
int use[MAXN], vis[MAXN]; //结点的匹配数组,访问数组
int n, m; //点数,线数
//查找从x出发的增广路径
int find(int x)
{
for (int i = 1; i <= n; i++)
{
if (edge[x][i] && !vis[i])
{
vis[i] = 1;
if (use[i] == -1 || find(use[i]))
{
use[i] = x;
return 1;
}
}
}
return 0;
}
int main()
{
int T;
cin >> T;
while (T--)
{
cin >> n >> m;
memset(edge, 0, sizeof(edge));
int u, v;
for (int i = 0; i < m; i++)
{
cin >> u >> v;
edge[u][v] = 1;
}
memset(use, -1, sizeof(use));
int sum = 0;
for (int i = 1; i <= n; i++)
{
memset(vis, 0, sizeof(vis));
if (find(i))
++sum;
}
cout << n - sum << endl;
}
return 0;
}
继续加油。