以 机器为点,以任务为边构图
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
vector<int> edge[300];
bool used[1100];
int con[1100];
bool find(int x)
{
for (int i = 0; i < edge[x].size(); i++)
if (!used[edge[x][i]])
{
used[edge[x][i]] = true;
if (con[edge[x][i]] == -1 || find(con[edge[x][i]]))
{
con[edge[x][i]] = x;
return true;
}
}
return false;
}
int match(int n)
{
memset(con, -1, sizeof(con));
int res = 0;
for (int i = 0; i < n; i++)
{
memset(used, false, sizeof(used));
if (find(i))
res++;
}
return res;
}
int main()
{
int n, m, k;
while (cin >> n&&n)
{
cin >> m >> k;
for (int i = 0; i < n; i++)
edge[i].clear();
for (int i = 0; i < k; i++)
{
int a, b, c;
cin >> a >> b >> c;
if (b == 0 || c == 0)
continue;
edge[b].push_back(c);
}
cout << match(n) << endl;
}
return 0;
}