在一个工厂,有两台机器A,
B生产产品。A机器有n种工作模式(模式0,模式1....模式n-1)。
B机器有m种工作模式(模式0,模式1....模式m-1)。
现在要加工k个产品。每个产品可以由两 台机器特定的模式生产。
例如:产品0,可以由A机器在3号模式或B机器4号模式生产。
两台机器初始模式都在模式0,但是,这两台机器不是很先进,如果需要切换模式,只能由
人手工切换模式,手工切换可以切换到任意模式。求加工完k个产品需要切换模式的最少次数。
(生产产品的顺序可以任意)
Input
这里有多组测试。每组测试第一行输入 n,m, k。(n,m<100),(k<1000)
接下来k行,给出k个产品(i,x,y).即第i个产品可以由A机器的x模式生产或B机器的y模式生产。
输入单个0, 测试结束。
Output
输出切换模式最少次数。
Sample Input
5 5 10 0 1 1 1 1 2 2 1 3 3 1 4 4 2 1 5 2 2 6 2 3 7 2 4 8 3 3 9 4 3 0
Sample Output
3
题解:套个板子ac
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
int n, m ,k;
const int maxn = 1e3+9;
int line[maxn][maxn];
int used[maxn];
int nxt[maxn];
bool find(int x)
{
for(int i = 1;i <= m;++i)
{
if(line[x][i] && !used[i])
{
used[i] = 1;
if(nxt[i] == -1 || find(nxt[i]))
{
nxt[i] = x;
return true;
}
}
}
return false;
}
int match()
{
int sum = 0;
for(int i = 1;i <= n;++i)
{
memset(used, 0, sizeof(used));
if(find(i))
{
sum++;
}
}
return sum;
}
int main()
{
while(~scanf("%d", &n))
{
if(n == 0)
{
return 0;
}
memset(line, 0, sizeof(line));
memset(nxt, -1, sizeof(nxt));
scanf("%d%d",&m, &k);
int x, y;
for(int i = 0;i < k;++i)
{
scanf("%d%d%d", &i, &x, &y);
if(x == 0 || y == 0)
{
continue;
}
line[x][y] = 1;
}
cout << match() <<endl;
}
return 0;
}