您的位置:首页 > 其它

匈牙利算法

2013-07-29 20:21 176 查看
二分图匹配的算法,二分图就是把图上的点分成两个互不相交的点集,而图中的边的端点只能分别属于这两个点集.

二分图的匹配,就是婚配问题,左边的点集男性,右边的点集女性,然后相互配对(一夫一妻);最大匹配就是让好事最多.

匈牙利算法可以实现这个东西.

匈牙利算法怎么实现的这个东西.这个比较多.代码如下:

#include <iostream>
#include <string.h>
#include <cstdio>
#define MAX 100

using namespace std;

int n, m;
int ans;
bool vis[MAX];
int use[MAX];
bool c[MAX][MAX];

void init()
{
int x, y;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
cin >> x >> y;
c[x][y] = true;
}
}

bool dfs(int x)
{
for (int i = 1; i <= n; i++)
{
if (c[x][i] && !vis[i])
{
vis[i] = true;
if (!use[i] || dfs(i))
{
use[i] = x;
return true;
}
}
}
return false;
}

void solve()
{
for (int i = 1; i <= n; i++)
{
memset(vis, false, sizeof(vis));
dfs(i);
}
}

void out()
{
for (int i = 1; i <= n; i++)
{
if (use[i])
{
ans++;
}
}

cout << ans << endl;

for (int i = 1; i <= n; i++)
{
if (use[i])
{
cout << use[i] << ' ' << i << endl;
}
}
}

int main()
{
init();
solve();
out();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: