POJ 1325 ZOJ 1364 最小覆盖点集

题意:有A,B两台机器, 机器A 有 n个模式(0, 1, 2....n-1),同样机器B有m个模式, 两个机器一开始的模式都为0,有k个作业(id,x,y) 表示作业编号id, 该作业必须在A机器在模式x下或者B机器在模式y下完成,问你至少要切换几次机器模式。
思路:很裸的最小覆盖点集,不熟悉概念的多看看蓝书吧,很容易证明 最小覆盖点集 == 最大匹配

 

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
vector <int> edge[113];
int pre[113];
bool vis[113];
int n, m, q;
bool dfs(int u) {
	for(int i = 0; i < (int)edge[u].size(); i++) {
		int v = edge[u][i];
		if(vis[v]) continue;
		vis[v] = 1;
		if(pre[v] == -1 || dfs(pre[v])) {
			pre[v] = u;
			return 1;
		}
	}
	return 0;
}
int main() {
	int i;
	while( ~scanf("%d", &n) && n) {
		scanf("%d%d", &m, &q);
		int x, y;
		for(i = 0; i < n; i++)
			edge[i].clear();
		while(q--) {
			scanf("%*d%d%d", &x, &y);
			if(!x || !y) continue;
			edge[x].push_back(y);
		}
		memset(pre, -1, sizeof(int)*m);
		int cnt = 0;
		for(i = 0; i < n; i++) {
			memset(vis, 0, sizeof(bool)*m);
			if(dfs(i)) cnt++;
		}
		printf("%d\n", cnt);

	}
	return 0;
}


 

 

posted @ 2013-09-05 17:51  pangbangb  阅读(145)  评论(0编辑  收藏  举报