题目大意:有两台机器A和B,A机器有n种工作方式,B机器有m种工作方式。共有k个任务。每个任务恰好在一条机器上运行。
如果任务在A机器上运行,就需要转换为模式Xi,如果在B机器上运行,就需要转换为模式Yi。
每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。
请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。
//二分匹配匈牙利算法的dfs实现
//时间复杂度为O(N);
//
#include<bits/stdc++.h>
using namespace std;
const int N=510;
int u,v;//a和b的数量
int g[N][N],l[N];//邻接矩阵 存右边对象
bool used[N];//右边对象是否访问过
bool dfs(int a)
{
for(int b=0;b<v;b++)
{
if(g[a][b]&&!used[b])
{
used[b]=1;
//成功的情况有俩种一种是最简单的右边还未分配左边,另一种就是右边已经匹配了,但是左边还可以匹配另一个右边的情况
if(l[b]==-1||dfs(l[b]))
{
l[b]=a;//给右边对象分配左边对象
return true;
}
}
}
return false;//不要省return false 毕竟不是void类型
}
int hungary()
{
int res=0;
memset(l,-1,sizeof l);
for(int a=0;a<u;a++)
{
memset(used,0,sizeof used);
if(dfs(a))
res++;
}
return res;
}
int main()
{
int k;
while(cin>>u&&u)
{
cin>>v>>k;
memset(g,0,sizeof g);
int id,a,b;
while(k--)
{
cin>>id>>a>>b;
if(a&&b)
{
g[a][b]=1;
}
}
cout<<hungary()<<'\n';
}
return 0;
}