题意大致是:有AB两台机器,A机器有n个模式,B机器有m个模式,k个任务,每个任务可以由AB其中一台机器完成,但需要不同的模式。机器每转换一次模式就要重启一次,机器初始时的模式是0,求重启的最小次数。
我们首先将AB的不同模式看作一个二分图,对于每一个任务i,如果它可以由A机器的j模式或者B机器的k模式完成,就在j,k之间连一条边,那么,我们只需要找到最少的点,使这些点可以覆盖所有的边即可满足题意。也就是求二分图的最小点覆盖,而我们知道二分图的最小点覆盖=最大匹配,所以我们可以直接利用匈牙利算法,求出二分图的最大匹配。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int m,n,k,pre[105];
bool a[105][105],f[105];
bool dfs(int x)
{
for (int i=1;i<m;i++)
{
if ((!a[x][i])||(f[i])) continue;
f[i]=1;
if ((pre[i]==-1)||(dfs(pre[i])))
{
pre[i]=x;
return 1;
}
}
return 0;
}
void hungary()
{
int ans=0;
memset(pre,-1,sizeof(pre));
for (int i=1;i<n;i++)
{
memset(f,0,sizeof(f));
if (dfs(i)) ans++;
}
printf("%d\n",ans);
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
if (!n) break;
scanf("%d%d",&m,&k);
memset(a,0,sizeof(a));
for (int i=0;i<k;i++)
{
int q,w,e;
scanf("%d%d%d",&q,&w,&e);
a[w][e]=1;
}
hungary();
}
return 0;
}