类型:最小顶点覆盖
题目:http://poj.org/problem?id=1325
思路:裸的最小顶点覆盖
!!!题意要把握准确[mode:工作模式,在同种模式下可进行多项工作]
// poj 1325 Machine Schedule
// ac 176K 0MS
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int n1, n2, m, ans;
int result[101];
bool state [101];
bool data[101][101];
bool find(int a) {
for (int i = 1; i <= n2; i++) {
if (data[a][i] == 1 && !state[i]) {
state[i] = true;
if (result[i] == 0 || find(result[i])) {
result[i] = a;
return true;
}
}
}
return false;
}
void solve() {
int t1, t2, x;
while(scanf("%d", &n1), n1) {
memset(data, false, sizeof(data));
memset(result, 0, sizeof(result));
ans = 0;
scanf("%d %d", &n2, &m);
for (int i = 1; i <= m; i++) {
scanf("%d %d %d", &x, &t1, &t2);
data[t1][t2] = true;
}
for (int i = 1; i <= n1; i++) {
memset(state, 0, sizeof(state));
if (find(i))
ans++;
}
printf("%d\n", ans);
}
}
int main() {
solve();
return 0;
}