您的位置:首页 > 其它

POJ 1325 ZOJ 1364 最小覆盖点集

2013-09-04 22:58 429 查看
题意:有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: