原题:http://acm.hdu.edu.cn/showproblem.php?pid=1150
题意:
有两台机器,k个任务,每台机器有n种状态,从0到n-1,初始状态都为0;
接下来k行,(i,x,y)表示任务i 既可以在A机器的x状态下完成,也可以在B机器的y状态下完成;
问最少要转换几次状态;
思路:
最小顶点覆盖 = 最大匹配
将能完成同一任务的两个状态建立关系,求个最大匹配就好;
#include<stdio.h>
#include<string.h>
const int N = 110;
int n, m, k;
int line[N][N];
int match[N], used[N];
bool find(int x)
{
for(int i = 0;i<m;i++)
{
if(line[x][i] == true && !used[i])
{
used[i] = 1;
if(match[i] == -1 || find(match[i]))
{
match[i] = x;
return true;
}
}
}
return false;
}
int main()
{
while(scanf("%d", &n)!=EOF)
{
if(n == 0) break;
scanf("%d%d", &m, &k);
memset(line, -1, sizeof(line));
memset(match, -1, sizeof(match));
while(k--)
{
int x, u, v;
scanf("%d%d%d", &x, &u, &v);
line[u][v] = true;
}
int sum = 0;
for(int i = 1;i<n;i++)
{
memset(used, 0, sizeof(used));
if(find(i))
sum++;
}
printf("%d\n", sum);
}
return 0;
}