您的位置:首页 > 其它

HDU - 2063 过山车(二分图匹配)

2016-07-18 15:20 344 查看

题目链接:

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

题解:

二分图匹配模板题。

AC代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int V[505][505];
int check[1000];
int matching[1000];
int n,m;
bool dfs(int u)
{
int i;
for(i = 1; i <= m; i++)
{
if(check[i] || V[u][i] != 1)//男孩已经被选走了或者这俩人互相不喜欢
continue;
check[i] = 1;
if(matching[i] == -1 || dfs(matching[i]))//利用dfs和增广路原理,观察男孩是否可以腾出位置或者没有被选走
{
matching[i] = u;//配个对
return true;
}
}
return false;
}

int solve(int n_left)
{
int i, ans = 0;
memset(matching, -1 ,sizeof(matching));
for(i = 1; i <= n_left; i++)
{
memset(check, 0 ,sizeof(check));
if(dfs(i))
ans++;
}
return ans;
}

int main()
{
int k ;
while(cin >> k)
{
if(k == 0)break;
memset(V,0,sizeof(V));
cin >> n >> m;
while(k--)
{
int a,b;
cin >> a >> b;
V[a][b] = 1;
}
cout << solve(n) <<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm