二分匹配匈牙利算法

#define parray 101
#define narray 301
int map[parray][narray];   //存储邻接矩阵
int match[narray];         //存储匹配
bool final[narray];        //用于标记DFS
int p,n;    //p代表二分图左半顶点个数,n代表二分图右半顶点个数
//利用DFS算法找增广路路径
bool DFS(int p)                                               
{
    int i,t;
    for(i=1;i<=n;++i) 
    {
        if(map[p][i] && !final[i])
        {
            final[i]= true;
            t = match[i];
            match[i] = p;
            if(t==0 || DFS(t)) return true;        //由二分图中的增广路径的性质可知,起点和终点都是目前还没有配对的点,而其它所有点都是已经配好对的。
            match[i] = t;  //注意二分匹配时不必在此处回溯时改变final的值,如果从一个点A出发,没有找到增广路径,那么无论再从别的点出发找到多少增广路径来改变现在的匹配,从A出发都永远找不到增广路径。
        }
    }
    return false;
}
int mat()
{
    int i,j;
    int maxmatch = 0;    //最大匹配数
    for(i=1;i<=p;++i)    //遍历二分图左半边的每个顶点,寻找增广路径
    {
        memset(final,0,sizeof(final));     //每次找寻增广路径时final初始化
        if(DFS(i)) maxmatch++;       
    }
    return maxmatch;
}
int main()
{   
    scanf("%d%d",&p,&n);
    memset(map,0,sizeof(map));         //初始化邻接矩阵
    memset(match,0,sizeof(match));     //初始化匹配
    mat();
    return 0;
}


posted @ 2010-05-31 20:47  北海小龙  阅读(255)  评论(0编辑  收藏  举报