题意:
有A,B两个机器,分别有n,m个档位,有k件工作,可以由x档位的A机器或者y档位的B机器完成。
问,可以改变完成工作的顺序,使切换档位的次数最小。
每件工作对应2个完成的档位,可以构建二分图,求图的最小点覆盖。
有向图:最小点覆盖=最大匹配
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2005
#define inf 1<<28
using namespace std;
int n;
vector<int>g1[Max];
bool visit[Max];
int match[Max];
void init(int n)
{
int i;
for(i=0; i<=n; i++)
{
g1[i].clear();
}
}
int dfs1(int cur)
{
int i;
for(i=0; i<g1[cur].size(); i++)
{
int k=g1[cur][i];
if(!visit[k])
{
visit[k]=1;
if(match[k]==-1||dfs1(match[k]))
{
match[k]=cur;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j,k,l,m;
int x,y;
while(scanf("%d",&k))
{
if(k==0)
return 0;
init(k);
memset(match,-1,sizeof(match));
scanf("%d%d",&m,&n);
while(n--)
{
scanf("%d%d%d",&i,&x,&y);
if(x==0||y==0)continue;//因为一开始档位在0,所以任何有0的工作都直接完成了,不需要再加进去,没写这个WA了3次。
g1[x].push_back(y);
}
int num=0;
for(i=0; i<k; i++)
{
memset(visit,0,sizeof(visit));
num+=dfs1(i);
}
cout<<num<<endl;
}
return 0;
}