#include<iostream> #include<string.h> using namespace std; const int N = 120; int g[N][N]; int linked[N];//linked[i] 代表与i连接的顶点 i是right集合中的顶点 linked[i]是left中的顶点 bool visit[N]; //顶点i是否访问 int n,m; //n的left集合的顶点数 m是right集合的顶点数 bool DFS(int x)//找到x的right中的连接点 { for(int i=0; i<m; i++) //这里标号从零开始 { if(!visit[i] && g[x][i])//i未访问并且x->i { visit[i] = 1; //如果linked[i] (left中元素)没有找到连接点 或找到 linked[i]的连接点 if(linked[i]==-1 || DFS(linked[i]))//找增光轨 { linked[i] = x; return true; } } } return false; } int MaxMatch() { int ans = 0; for(int i=0; i<n; i++) { memset(visit, 0, sizeof(visit)); if(DFS(i)) ans++; } return ans; } int main() { while(scanf("%d",&n)!=EOF) { if(n==0) break; int w,E,x,y;//w是权值 k是二分图中的边数 x y是这个二分图的边连接的俩个顶点 scanf("%d %d",&m, &E); memset(g, 0, sizeof(g)); memset(linked, -1, sizeof(linked)); for(int i=0; i<E; i++) { scanf("%d %d %d",&w, &x, &y);//w 是权 //俩个数都不为0 if(x*y) g[x][y] = 1; //g[x][y] = w; } int ret = MaxMatch(); printf("%d/n",ret); } return 0; }