二分图匹配的算法,二分图就是把图上的点分成两个互不相交的点集,而图中的边的端点只能分别属于这两个点集.
二分图的匹配,就是婚配问题,左边的点集男性,右边的点集女性,然后相互配对(一夫一妻);最大匹配就是让好事最多.
匈牙利算法可以实现这个东西.
匈牙利算法怎么实现的这个东西.这个比较多.代码如下:
#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;
}