#include<stdio.h> #include<string.h> int n1,n2,m,ans;//n1代表集合1的顶点个数,n2,m边数,ans最大匹配数 int result[101];//记录V2中的点匹配的点的编号 bool state[101];//记录V2中的每个点是否被搜索过 bool data[101][101];//邻接矩阵 true代表有边相连 void init() { int t1,t2,i; memset(data,false,sizeof(data)); memset(result,0,sizeof(result)); ans=0; scanf("%d %d %d",&n1,&n2,&m); for(i=1;i<=m;i++) { scanf("%d %d",&t1,&t2); data[t1][t2]=true; } return; } bool find_p(int a) { int i; for(i=1;i<=n2;i++) { if(data[a][i]==true && !state[i])//如果节点i与a相邻并且未被查找过 { state[i]=true; if(result[i]==0 || find_p(result[i]))//如果i未在前一个匹配M中 //i在匹配M中,但是从与i相邻的节点出发可以有增广路 { result[i]=a;//记录查找成功记录 return true;//返回查找成功 } } } return false; } int main() { freopen("in.txt","r",stdin); init(); for(int i=1;i<=n1;i++) { memset(state,false,sizeof(state)); if(find_p(i)) ans++; } printf("%d/n",ans); return 0; }