匈牙利算法

来源:互联网 发布:linux口袋书 编辑:程序博客网 时间:2024/05/20 17:25
/*  Name: 匈牙利算法   Copyright:   Author: 巧若拙   Date: 12-06-17 10:52  Description: */#include <iostream>#include <math.h>using namespace std;#define MAX 502int map[MAX][MAX];int n,k;int mk[MAX];//从X集合中的顶点u出发用深度优先的策略寻找增广路//(这种增广路只能使当前的匹配数增加1)int nx,ny; //X和Y集合中顶点的个数int cx[MAX], cy[MAX];//cx[i]表示最终求得的最大匹配中与Xi匹配的Y顶点, cy[i]同理int Path(int u);int MaxMatch(); //求二部图最大匹配的匈牙利算法int main(){    int i,j;    int a,b;        cin >> n >> k;    nx = ny = n;    memset(map,0,sizeof(map));    for (i=0; i<k; i++)    {    cin >> a >> b;    map[a][b] = 1; //表示Xa和Yb有连接     }    int max=MaxMatch();    cout << max << endl;        system("pause");                           return 0;}int Path(int u){    for (int v=0; v<ny; v++) //考虑所有Yi顶点v    {        if (map[u][v]!=0 && mk[v]==0)    {        mk[v] = 1;   //如果v没有匹配,或者如果v已经匹配了,但从y[v]出发可以找到一条新的增广路        if (cy[v]==-1 || Path(cy[v]))        {            cx[u] = v; //把v匹配给u            cy[v] = u; //把u匹配给v            return 1; //找到可增广路        }    }    }    return 0 ; //如果不存在从u出发的增广路}int MaxMatch() //求二部图最大匹配的匈牙利算法{    int res=0;        for(int i=0; i<MAX; ++i) //初始化列表     {    cx[i] = cy[i] = -1;    }        for (int i=0; i<nx; i++)    {        if (cx[i] == -1) //从每个未盖点出发进行寻找增广路        {            memset(mk, 0, sizeof(mk));            res += Path(i); //每找到一条增广路,可使得匹配数加1        }    }    return res;}

原创粉丝点击