您的位置:首页 > 其它

常用的二分图模板 匈牙利算法

2011-09-24 19:26 417 查看
 
#include <iostream>

#include <stdio.h>

#include <cstring>

using namespace std;

const int MAXN = 1002;

// 二分图匹配,返回最大的匹配数

// linker中保存匹配的关系 点从0开始

int g[MAXN][MAXN];

int n , m;

int linker[MAXN];

bool used[MAXN];

bool DFS ( int  a )

{

    for ( int i = 0 ; i < m; i ++ )

        if (g[a][i] && !used[i] )

        {

            used[i] = true ;

            if ( linker[i] == -1 || DFS( linker[i] ))

            {

                linker[i] = a;

                return true;

            }

        }

    return false;

}

int hungray ( )

{

    int result = 0;

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

    for ( int i = 0 ; i < n; i ++ )

    {

        memset ( used , 0 , sizeof ( used )) ;

        if ( DFS ( i ) )

            result ++;

    }

    return result;

}

 

 

// poj3041 把图看做成邻接矩阵就可以了 然后求二分图的最小点覆盖

// poj1325 将除0以外的点 构图 二分图的最小点覆盖

//注意这里面的点数从0开始的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 linker include