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