二分图基数最大匹配 匈牙利算法

来源:互联网 发布:python reduce表达式 编辑:程序博客网 时间:2024/05/30 05:01

二分图匹配主要是建图方法,有行列匹配法,黑白染色法,反建法,拆点法,拆行拆列法..

下面是poj 3041的代码,行列匹配...

//匈牙利算法,求二分图的最大基数匹配 //动态存边时间复杂度O(nm),矩阵的话时间复杂度O(n^3)#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;#define maxv 1005vector<int> edge[maxv];int n,m,k;bool used[maxv];int match[maxv];void init(){    int i,l,r;//    cin>>n>>m;    memset(match,0,sizeof(match));    for(i=1;i<=n;++i)        edge[i].clear();    for(i=0;i<k;++i)    {        cin>>l>>r;        edge[l].push_back(r);    }}bool GetAugPath(int s){    int i,t;    for(i=0;i<edge[s].size();++i)    {        t=edge[s][i];        if(!used[t])        {            used[t]=true;            if(match[t]==0||GetAugPath(match[t]))            {                   match[t]=s;                return true;            }        }    }    return false;}int work(){    init();    int i,ans=0;    for(i=1;i<=n;++i)    {        memset(used,0,sizeof(used));        if(GetAugPath(i))            ans++;    }//    cout<<"done"<<endl;    return ans;}int main(){    int i,l,r;    while(cin>>n>>k)    {        m=n;        cout<<work()<<endl;    }    return 0;}


 

原创粉丝点击