最小点权覆盖 = 最大匹配
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1005;
bool map[MAXN][MAXN];
bool visy[MAXN];
int match[MAXN];
int n1,n2;//x集合的个数,y集合的个数
bool DFS(int x)
{
for(int i = 1;i<n2;i++)
{
if(!visy[i]&&map[x][i])
{
visy[i] = true;
if(match[i]==-1||DFS(match[i]))
{
match[i] = x;
return true;
}
}
}
return false;
}
int main()
{
int m;
int u,v,w;
while(scanf("%d",&n1)&&n1)
{
scanf("%d %d",&n2,&m);
int ans = 0;
memset(match,-1,sizeof(match));
memset(map,0,sizeof(map));
for(int i = 0;i<m;i++)
{
scanf("%d %d %d",&u,&v,&w);
map[v][w] = 1;
}
for(int i = 1;i<n1;i++)
{
memset(visy,0,sizeof(visy));
if(DFS(i)) ans++;
}
printf("%d\n",ans);
}
return 0;
}