二分图最小顶点覆盖问题
弱博里另一篇同问题题解:http://blog.csdn.net/challengerrumble/article/details/47099899
该题大意有两条流水线A B
A中有n台机器,B中有m台
现在有k个任务 每个任务可由A中第i台或B中第j台完成 每条流水线变更机器时需要花费1时间 问最小时间
每个任务相当于一条边 连接二分图两集合各一个顶点 该问题既可理解为求将所有边都容纳所需最小顶点数(即为二分图最小顶点覆盖问题)
二分图最小顶点=求最大匹配
代码如下:
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
bool mp[111][111],vis[111];
int link[111],n,m;
bool can(int p)
{
int i;
for(i = 1; i <= m; ++i)
{
if(!vis[i] && mp[p][i])
{
vis[i] = true;
if(link[i] == -1 || can(link[i]))
{
link[i] = p;
return 1;
}
vis[i] = false;
}
}
return 0;
}
int main()
{
int k,i,x,y,cnt;
while(~scanf("%d",&n) && n)
{
cnt = 0;
memset(mp,0,sizeof(mp));
scanf("%d%d",&m,&k);
while(k--)
{
scanf("%d %d %d",&i,&x,&y);
mp[x][y] = true;
}
memset(link,-1,sizeof(link));
for(i = 1; i <= n; ++i)
{
memset(vis,0,sizeof(vis));
if(can(i)) cnt++;
}
printf("%d\n",cnt);
}
return 0;
}