这个要求是每一项任务都要有一个机器来完成的。
算是个模板题吧。
我们可以这样想。
A机器的所有工作模式是一个集合,B机器的所有工作模式是一个集合。
把任务看成是边,一端连着A的某一种模式,一端连着B的某一种模式。(因为某个任务可以由A的某种模式完成,也可以由B的某种模式完成。)
因为我们想把所有的任务都做完,那就要求每一条边都至少有一个点与其相连。
即最小点覆盖集。 怎么求?上定理最小点覆盖集点数=最大匹配数。
AC代码:
还是朴素的匈牙利算法啦~~
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
const int maxn=1e3+10;
int A,B,R;
bool mp[maxn][maxn];
bool used[maxn];
int mate[maxn];
bool Findm(int x)
{
for(int i=1;i<B;i++)
{
if(!used[i]&&mp[x][i])
{
used[i]=1;
if(!mate[i]||Findm(mate[i]))
{
mate[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d",&A)==1&&A)
{
scanf("%d%d",&B,&R);
memset(mp,0,sizeof(mp));
for(int i=1;i<=R;i++)
{
int t3,t1,t2;
scanf("%d%d%d",&t3,&t1,&t2);
mp[t1][t2]=1;
}
memset(mate,0,sizeof(mate));
int ans=0;
for(int i=1;i<=A;i++)
{
memset(used,0,sizeof(used));
ans+=Findm(i);
}
printf("%d\n",ans);
}
}