比较容易看出是最小点覆盖问题,并且本题因为只有两种机器,所以是二分图问题,将对应的任务的两种机器连边
答案就是求取最大匹配数。
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n,m,k; int match[N]; int g[200][200]; int st[200]; int find(int u){ int i; for(i=1;i<m;i++){ if(!st[i]&&g[u][i]){ st[i]=1; if(match[i]==-1||find(match[i])){ match[i]=u; return true; } } } return false; } int main(){ while(cin>>n>>m>>k){ if(n+m+k==0) break; int i; memset(match,-1,sizeof match); memset(g,0,sizeof g); for(i=1;i<=k;i++){ int t,a,b; cin>>t>>a>>b; if(!a||!b) continue; g[a][b]=1; } int res=0; for(i=1;i<n;i++){ memset(st,0,sizeof st); if(find(i)) res++; } cout<<res<<endl; } return 0; }