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;

}


 

 

你可能感兴趣的:(poj)