码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 2063 过山车 二分图最大匹配(模板题)

时间:2017-05-31 12:01:58      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:i++   模板题   意义   tin   class   hung   mem   type   pre   

http://acm.hdu.edu.cn/showproblem.php?pid=2063

https://www.renfei.org/blog/bipartite-matching.html

交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。

增广路:从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替路称为增广路(agumenting path)

增广路有一个重要特点:非匹配边比匹配边多一条。因此,研究增广路的意义是改进匹配。只要把增广路中的匹配边和非匹配边的身份交换即可。由于中间的匹配节点不存在其他相连的匹配边,所以这样做不会破坏匹配的性质。交换后,图中的匹配边数目比原来多了 1 条。

 

#include <bits/stdc++.h>
using namespace std;
const int N=2e3+20;
typedef long long ll;
int g[N][N];// 两边定点的连线 
int k,n,m,vis[N];
int linker[N];
int dfs(int u)
{
	for(int i=1;i<=m;i++)
	{
		if(g[u][i]&&!vis[i])
		{
			vis[i]=1;
			if(linker[i]==-1||dfs(linker[i]))//如果u-i未匹配||i匹配 走匹配边 
			{
				linker[i]=u;//非匹配边和匹配边交换 
				return true;
			}
		}
	}
	return false;//无增广路 
}
int hungary()
{
	int res=0;
	int u;
	memset(linker,-1,sizeof(linker));
	for(int i=1;i<=n;i++)
	{
		memset(vis,0,sizeof(vis));		
		if(dfs(i))//从未盖点出发找增广路 
			res++;
	}
	return res;
} 
int main()
{
	while(cin>>k&&k)
	{
		memset(g,0,sizeof(g));
		cin>>n>>m;
		int u,v;
		for(int i=1;i<=k;i++)
		{
			cin>>u>>v;
			g[u][v]=1;
		}
		printf("%d\n",hungary());//最大匹配 
	}
	return 0;
}

  

HDU 2063 过山车 二分图最大匹配(模板题)

标签:i++   模板题   意义   tin   class   hung   mem   type   pre   

原文地址:http://www.cnblogs.com/HIKARI1149/p/6923027.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!