题目大意:第一行输入3个整数n,m,k。分别表示女生数(A机器数),男生数(B机器数),以及它们之间可能的组合(任务数)。
在接下来的k行中,每行有3个整数c,a,b。表示任务c可以有机器A的a状态或者是机器B的b状态来完成
解题思路:最小点覆盖数
1)如果把一个任务看成是一条直线,那么机器的状态就为一个点。在所有任务都必须完成的情况下(即一条直线上至少要有一个端点),
求所需要的最少的端点数
代码如下:
/* * 1150_1.cpp * * Created on: 2013年8月30日 * Author: Administrator */ #include <iostream> using namespace std; const int maxn = 101; int map[maxn][maxn]; int link[maxn]; bool useif[maxn]; int n,m; int can(int t){ int i; for(i = 1 ; i <= m ; ++i){ if(useif[i] == 0 && map[t][i]){ useif[i] = 1; if(link[i] == -1 || can(link[i])){ link[i] = t; return 1; } } } return 0; } int max_match(){ int i; int num = 0; memset(link,-1,sizeof(link)); for(i = 1 ; i<= n ; ++i){ memset(useif,0,sizeof(useif)); if(can(i)){ num++; } } return num; } int main(){ int k; while(scanf("%d%d%d",&n,&m,&k)!=EOF,n){ int i; memset(map,0,sizeof(map)); for(i = 0 ; i < k ; ++i){ int c,a,b; scanf("%d%d%d",&c,&a,&b); map[a][b] = 1; } printf("%d ",max_match()); } }