int n1,n2,edge; |
int map[M][M]; //邻接矩阵 |
int vis[M]; //n2,集合中对每一个点的访问做标记 |
int match[M}; //表示当前n1中可以与 n2 集合中相邻的点 |
void init( ) |
{ |
int n1,n2,edge; |
scanf ( "%d%d%d" ,&n1,&n2,&edge); |
memset (map,0, sizeof (map)); |
memset (match,0, sizeof (match)); |
for ( int i=0;i<edge;i++) |
{ |
int x,y; |
scanf ( "%d%d" ,&x,&y); |
map[x][y]=1; |
} |
} |
int find( int node) //是否存在n1集合中以结点node开始的增广路 |
{ |
for ( int i=1;i<=n2;i++) |
if (map[node][i]&&!vis[i]==0) //如果节点 i 与 node相邻并且未访问过 |
{ |
vis[i]=1; |
if (match[i]==-1||find(match[i])) //如果找到一个未覆盖点i中或从与i相邻的节点出发有增广路 |
{ |
match[i]=node; |
return 1; |
} |
} |
return 0; |
} |
int result_max_match( int n1) //返回最大二分匹配值 |
{ |
int i,ans=0; |
for (i=1;i<=n1;i++) |
{ |
memset (vis,0, sizeof (vis)); //注意初始化 |
if (find(i)) |
ans++; |
} |
return ans; |
} |