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

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;
}

  

时间: 2024-12-06 03:42:03

HDU 2063 过山车 二分图最大匹配(模板题)的相关文章

[HDU] 2063 过山车(二分图最大匹配)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2063 女生为X集合,男生为Y集合,求二分图最大匹配数即可. 1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 #include<stdbool.h> 7 #include<ti

HDU 2063 过山车 二分图题解

一个男女搭配的关系图,看可以凑成多少对,基本和最原始的一个二分图谜题一样了,就是 一个岛上可以凑成多少对夫妻的问题. 所以是典型的二分图问题. 使用匈牙利算法,写成两个函数,就非常清晰了. 本程序还带分配释放程序,当然oj一般不需要.但是好的程序一定要. #include <stdio.h> #include <stdlib.h> int K, M, N, a, b; int *linker; bool **gra, *used; void initGraph() { gra =

hdu 2063 过山车(匈牙利算法模板)

http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14056    Accepted Submission(s): 6196 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车

hdu 2063 过山车 二分图的最大匹配模板。。感觉模板代码很简洁

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13092    Accepted Submission(s): 5746 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做pa

HDU 2063 过山车 (最大匹配,男女配对,二分图)

题意:中文题目 思路:匈牙利算法解决二分图最大匹配问题. 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=505; 4 int mapp[N][N]; //矩阵 5 int girl[N]; //记录该女已分配的男编号 6 int vis[N]; //标记是否已经尝试为其另分配 7 int n, a, b, k, m; 8 9 int find(int x) 10 { 11 for(int i=1; i<=m

hdu 2063 过山车 二分图的最大匹配 匈牙利算法

题目地址:http://acm.hdu.edu.cn/showproblem.php? pid=2063 #include <iostream> #include <stdio.h> #include <string.h> using namespace std; int n,m,k; int link[505][505]; int used[505]; int boy[505]; int find(int x){ int i; for(i=1;i<=n;i++)

hdu 2063 过山车(二分图匹配最大匹配数模板)

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10776    Accepted Submission(s): 4748 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做par

HDU2063_过山车(二分图/最大匹配)

解题报告 题目传送门 题意: 求最大的男女匹配数目. 思路: 简单的最大匹配. #include <cstdio> #include <cstring> #include <iostream> using namespace std; int k,n,m,mmap[1100][1100],vis[550],pre[550]; int dfs(int x) { for(int i=1;i<=n;i++){ if(!vis[i]&&mmap[x][i]

hdu 2063 过山车(模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 21121    Accepted Submission(s): 9154 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求