题目大意:
给你两台机器A和B,A机器有n种模式,B机器有m种模式,初始时都是0,现在给你k个任务,每个任务可以由机器A的x模式完成或者机器B的y模式完成,而每次改变机器的模式都要重启一次,问你最少的重启次数使得完成所有任务!
题目思路:
二分图匹配,匹配数就等于重启数,因为其他匹配不上的数就是它想匹配的数被别的数给占用了,也就是这个他相匹配的那个数能代替它的操作,就不用重启电脑了, 你可以试着写几组简单样例来证实一下,不难理解,理解了之后超简单。
这个题还能用最小点覆盖的方法。
#include<bits/stdc++.h>
using namespace std;
#define maxn 107
int ln, rn;
int g[maxn][maxn];
bool used[maxn];
int linker[maxn];
int dfs(int l)
{
for(int i=1; i<=rn; i++)
{
if(g[l][i] && !used[i])
{
used[i] = true;
if(linker[i] == -1 || dfs(linker[i]))
{
linker[i] = l;
return 1;
}
}
}
return 0;
}
int hungary()
{
int res = 0;
memset(linker, -1, sizeof(linker));
for(int i=1; i<=ln; i++ )
{
memset(used, 0 ,sizeof(used));
if(dfs(i))
res++;
}
return res;
}
int main()
{
int n, m, k;
while(scanf("%d", &n) , n)
{
memset(g, 0, sizeof(g));
scanf("%d%d", &m, &k);
int t, u, v;
for(int i=0; i<k; i++)
{
scanf("%d%d%d", &t, &u, &v);
if(u&&v) g[v][u] = 1;
}
ln = n;
rn = m;
int res = hungary();
printf("%d\n", res);
}
return 0;
}