匈牙利算法

来源:互联网 发布:unity3d引擎架构 编辑:程序博客网 时间:2024/06/06 20:57
输入k组匹配, n1为左部点集的数量,n2为右部点集的数量

a为左部点集,b为右部点集

const int MAXN = 5000;int n1, n2;int from[MAXN+10];bool use[MAXN+10];int tot;bool match ( int x ){    for ( int i = 0; i < g[x].size(); ++i ){        if ( ! use[g[x][i]] ){            use[g[x][i]] = true;            if ( from[g[x][i]] == 0 || match ( from[g[x][i]] ) ){                from[g[x][i]] = x;                return true;            }        }    }    return false;}int hungary() {    tot = 0;    memset ( from, 0, sizeof ( from ) );    for ( int i = 1; i <= n2; i ++ ){        memset ( use, 0, sizeof ( use ) );        if ( match(i) ){            tot ++;        }    }    return tot;}int main(){    ios::sync_with_stdio( false );    int k;    while ( cin >> k && k ){        for ( int i = 0; i < MAXN; i ++ )  g[i].clear();        cin >> n1 >> n2;        int a, b;        for ( int i = 0; i < k; i ++ ){            cin >> a >> b;            g[a].push_back ( b );        }        cout << matching() <<endl;    }    return 0;}


0 0
原创粉丝点击