acm.hdu.edu.cn/showproblem.php?pid=1150
A和B两台机器的工作特点是每切换一个工作模式都需要付出手动重启的代价(注意:开始是模式0,因此0不需要付出代价,不算在处理的数据中),现在希望所付出的代价最小,那么就是,如果现在是模式i那么就完成所有i能做完的工作,不难想到这是二分图的最小点集覆盖。最小点集覆盖=最大匹配数。使用匈牙利算法。
AC代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int V = 111;
const int MAX = 2010;
int n,m,k;
int G[V][V];
int check[MAX],ma[MAX],mb[MAX];
int DFS(int u){
for(int i=1; i<m; i++){
if(G[u][i] > 0 && !check[i]){
check[i] = 1;//如果i匹配成功不需继续匹配,如果不能匹配成功,那么再也不能匹配成功,因此直接标记即可
if(mb[i] == -1 || DFS(mb[i])){
ma[u] = i;
mb[i] = u;
return 1;
}
}
}
return 0;
}
void MP(){
int res = 0;
memset(ma, -1, sizeof(ma));
memset(mb, -1, sizeof(mb));
for(int i=1; i<n; i++){
memset(check, 0, sizeof(check));
res += DFS(i);
}
printf("%d\n",res);
}
int main(){
while(scanf("%d%d%d",&n,&m,&k) == 3){
if(!n) break;
memset(G, 0, sizeof(G));
while(k--){
int i,a,b;
scanf("%d%d%d",&i,&a,&b);
G[a][b] = 1;
}
MP();
}
return 0;
}