题目大意:
两个机器人A、B用来完成任务
其中A有N中模式,B有M种模式
完成任务i 需要A为x模式,或者B为y模式
每次改变模式需要重启一次
问完成所有任务所需要的最少重启次数
将每对x,y相连得到一个二分图
每条线代表一个任务
即求二分图的最小点覆盖数
由于二分图中最小点覆盖数=最大匹配数
故可用匈牙利算法
#include <stdio.h>
#include <string.h>
#define MAXN 110
int xn,yn;
int line[MAXN][MAXN];
int used[MAXN];
int match[MAXN];
int dfs(int u)
{
int v;
for(v=1;v<=yn;v++)
{
if(line[u][v]&&!used[v])
{
used[v]=1;
if(!match[v]||dfs(match[v]))
{
match[v]=u;
return 1;
}
}
}
return 0;
}
int main()
{
int i,x,y,k,ans;
while(scanf("%d%d%d",&xn,&yn,&k)&&xn)
{
memset(match,0,sizeof(match));
memset(line,0,sizeof(line));
while(k--)
{
scanf("%d%d%d",&i,&x,&y);
line[x][y]=1;
}
for(ans=0,i=1;i<=xn;i++)
{
if(dfs(i))
ans++;
memset(used,0,sizeof(used));
}
printf("%d\n",ans);
}
return 0;
}