二分图最大匹配 匈牙利算法模板

二分图最大匹配问题的匈牙利算法:

#include<iostream>
using namespace std;
const int Max = 405;

 

int n, m;                       //  二分图中x和y中点的数目
int link[Max];                  //  link[x]记录当前与y节点相连的x的节点。
bool map[Max][Max], vis[Max];   //  map[i][j]记录连接x和y的边,如果i和j之间有边则为1,否则为0。

 

bool dfs(int u){                //  dfs实现,u表示现在在寻求匹配y的点x。
    for(int i = 1; i <= m; i ++)
        if(!vis[i] && map[u][i]){
            vis[i] = true;
            if(link[i] == -1 || dfs(link[i])){    //  条件:点i还没匹配,或者link[i]找到新的匹配。
                link[i] = u;
                return true;
            }
        }
    return false;
}

 

int MaxMatch(){

    int i,num = 0;

    memset(link, -1, sizeof(link));

    for(i = 1;i <= n; i ++){

        memset(vis, 0, sizeof(vis));

        if(bfs(i)) num++;

    }

    return num;

}

 

posted @ 2011-12-04 00:00  快乐.  阅读(186)  评论(0编辑  收藏  举报