码迷,mamicode.com
首页 > 系统相关 > 详细

hdu1150-Machine Schedule(最小点覆盖)

时间:2016-08-23 14:36:51      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

二分图的最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联。
     最大匹配数 = 最小点覆盖数(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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!