点击打开链接


#include<stdio.h>
#include<string.h>

const int INF = 505;
 

int dfs(int u);			//搜索以u点为起点的增广路经,如果能搜到返回1,不能返回0;
 
int edge[INF][INF];		//以邻接矩阵的形式建立二分图。 

int n, k;

int vx[INF], vy[INF];	//vy存的是在y集合中已经匹配过的x点,所以匹配边i->j的表示方法为vy[i]=j; 
					 

int vis[INF];		//用来标记在搜索过程中某点是否已经在增广路中,如果已经在就不用在向增广路添加了。 

 
/*
3 4
1 1
1 3
2 2
3 2
Sample Output
2
*/
int main()
{
	scanf("%d %d",&n, &k);
	
	memset(edge, -1, sizeof(edge));
	
	for(int i=1; i <= k; i++)
	{
		int x, y;
		scanf("%d %d", &x, &y);
		edge[x][y] = 1;
	}
	
	memset(vx, -1, sizeof(vx));
	memset(vy, -1, sizeof(vy));		//一开始,二分图中没有点匹配。 
	
	int result = 0;					//一开始二分图匹配数为0;
	 
	for(int u = 1; u <= n; u++)		//对二分图中左边的每个点寻找增广路。 
	{
		memset(vis, 0, sizeof(vis));
		result += dfs(u) ;			//如果知道增广路,那么 匹配数+1; 
	}
	
	printf("%d\n", result) ;
	
	 
	
	
	
	return 0;
}

int dfs(int u)
{
	for(int v = 1; v <= n; v++)
	{
		if(edge[u][v] == 1 && vis[v] == 0)	//如果u,v两点之间有边(也就是两点可以匹配),
											//并且v不再增广路中
		{
			vis[v] = 1; 	//将 v点加入增广路。
			if(vy[v] == -1 ||dfs(vy[v]) == 1)	//如果该点为为非匹配点
												//或者能根据该点匹配的x中点找到未匹配点
			{
				vx[u] = v;						//翻转关系 
				vy[v] = u; 
				return 1;
			} 
		} 
	}
	return 0;
}