最小顶点覆盖=最大匹配
#include<iostream>
using namespace std;
int mat[1000][1000];
int link[1000];
int useif[1000];
int gl,gr;
int can(int t)
{
int i;
for(i=1;i<=gr;i++)
{
if(useif[i]==0&&mat[t][i])
{
useif[i]=1;
if(link[i]==-1||can(link[i]))
{
link[i]=t;
return 1;
}
}
}
return 0;
}
int MaxMathch()
{
int i,num=0;
memset(link,0xff,sizeof(link));
for(i=1;i<=gl;i++)
{
memset(useif,0,sizeof(useif));
if(can(i))
{
num++;
}
}
return num;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
int i,j;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
memset(mat,0,sizeof(mat));
int m,k;
scanf("%d%d",&m,&k);
gl=n;
gr=m;
int x,y,z;
for(i=1;i<=k;i++)
{
scanf("%d%d%d",&x,&y,&z);
mat[y][z]=1;
}
cout<<MaxMathch()<<endl;
}
return 0;
}