二分匹配模版

int lef[N*N];//lef[v]表示右边点v 当前连接的点

bool T[N*N];//右边的点是否连过

vector<int>G[N];//G是映射,G[X集].push_back(Y集)  注意G的初始化



bool match(int x)

{

	for(int i=0;i<G[x].size();i++)

	{

		int v=G[x][i];

		if(!T[v])

		{

			T[v]=true;

			if(lef[v]==-1||match(lef[v]))

			{

				lef[v]=x;

				return true;

			}

		}

	}

	return false;

}



void solve()

{

	int ans=0;

	memset(lef,-1,sizeof(lef));

	for(int i=0;i<pn-1;i++)//左右点集匹配,左点集是 0-(pn-1) 右点集是G[左点].size()

	{

		memset(T,0,sizeof(T));



		if(match(i))ans++;

	}

	printf("%d\n",ans);

}




 九野的博客,转载请注明出处 http://blog.csdn.net/acmmmm/article/details/10967931

 

你可能感兴趣的:(模版)