二部图-匈牙利算法实现

来源:互联网 发布:js设置button颜色 编辑:程序博客网 时间:2024/04/28 09:02
  • 两篇参考网址
    • http://blog.csdn.net/dark_scope/article/details/8880547 相亲举例
    • http://m.blog.csdn.net/blog/fyxz1314/37651567 偏公式
  • 增广路径:非匹配边->匹配边->非匹配边组成的路径
  • 递归:将之前匹配边的女生赋给新的男生,之前匹配边的男生重新找到心仪的女生,如此递归。
#include <iostream>#include <fstream>using namespace std;#define MAXN 100int m,n; // 男女生数目bool edge[MAXN][MAXN]; // 男生是否心仪某女生int link[MAXN]; // 右边的点和左边哪个点陪陪bool visit[MAXN]; // 该女生是否被访问过bool find_path(int u){for (int v = 1; v <= n; ++v) // 遍历右边顶点{if (edge[u][v] && !visit[v]){visit[v] = true;if (!link[v] || find_path(link[v])) // 右边顶点还没有匹配,或已经匹配的左边顶点可以去寻找另一个右边顶点,而把该右边顶点让给当前左边顶点{link[v] = u; // 这就相当于加一个匹配边了return true;}}}return false;}// 返回匹配边数目int hungary(){int ans = 0;memset(link, 0, sizeof(link));for (int u = 1; u <= m; ++u) // 遍历左边男生{memset(visit, false, sizeof(visit));if (find_path(u)) // 发现有增广路径++ans;}return ans;}int main(){memset(edge, false, sizeof(edge));ifstream in("data.txt");in >> m >> n;int a,b;while (in >> a >> b){edge[a][b] = true;}in.close();cout << "最大匹配数:"<< hungary() << endl;return 0;}



0 0
原创粉丝点击