标签:
二分图的最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联。
最大匹配数 = 最小点覆盖数(Konig 定理)
水题……
突然发现我以前的匈牙利算法模版有问题……因为这里左边的点时1~n,右边的点是1~m,所以有不同的点标号是相同的,注意注意!
因为这个算法本身是O(n^2)的,所以数据必然不会很大,放心用邻接矩阵存吧……
如果某个边有0,那么不需要加进来,每个产品应该只会出现一次,不然就不对了吧……我想了好久,因为题目并没有说每个产品只出现一次……
//hdu1150
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 105;
int n, m, k;
bool mp[N][N];
int match[N];
bool used[N];
bool find(int u) {
for (int v = 0; v < m; ++v) {
if (mp[u][v] && !used[v]) {
used[v] = true;
if (match[v] == -1 || find(match[v])) {
match[v] = u;
return true;
}
}
}
return false;
}
int hungary() {
memset(match, -1, sizeof match);
int ans = 0;
for (int i = 0; i < n; ++i) {
memset(used, false, sizeof used);
if (find(i)) ++ans;
}
return ans;
}
int main() {
//freopen("in", "r", stdin);
while (~scanf("%d", &n) && n) {
scanf("%d%d", &m, &k);
int u, v;
memset(mp, false, sizeof mp);
while (k--) {
scanf("%*d%d%d", &u, &v);
if (!u || !v) continue;
mp[u][v] = true;
}
printf("%d\n", hungary());
}
return 0;
}
hdu1150-Machine Schedule(最小点覆盖)
标签:
原文地址:http://www.cnblogs.com/wenruo/p/5799177.html