hdu 2063 过山车 (最大匹配 匈牙利算法模板)

时间:2023-03-09 09:52:24
hdu 2063 过山车 (最大匹配  匈牙利算法模板)

匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。

题目链接:

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

题目大意:

  中文题目,点进去马上知道。

解题思路:

  这道题目就是求最大匹配数目,直接套用匈牙利算法模板,这个算法大概原则就是:有机会上,没有机会创造机会也要上。

代码:

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; #define maxn 505
int map[maxn][maxn], used[maxn], girl[maxn], n, m;
//map储存匹配关系,used用来标记是否增广过,girl[i]表示girl[i]这个女生已经和i这个男生匹配
bool find (int x);
int main ()
{
int k;
while (scanf ("%d", &k), k)
{
scanf ("%d %d", &m, &n);
memset (map, , sizeof(map));
memset (girl, , sizeof(girl)); while (k --)
{
int u, v;
scanf ("%d %d", &u, &v);
map[u][v] = ;
} int sum = ;
for (int i=; i<=m; i++)
{//每个女生匹配,都需要清空标记增广数组
memset (used, , sizeof(used));
if (find (i))
sum ++;
}
printf ("%d\n", sum);
}
return ;
} bool find (int x)
{//dfs增广,寻找x的匹配
for (int i=; i<=n; i++)
{
if (!used[i] && map[x][i])
{//未被增广并且x与i可以匹配
used[i] = ;
if (!girl[i] || find(girl[i]))
{//i没有和任一个女生匹配或者发现增光路,则匹配成功
girl[i] = x;
return true;
}
}
}
return false;
}