二分图匹配 板子(匈牙利&HK)

来源:互联网 发布:视频画面剪切软件 编辑:程序博客网 时间:2024/06/14 22:11

仅仅是板子。

HK:

#include<iostream>#include<cstdio>#include<vector>#include<algorithm>#include<queue>using namespace std;#define INF 1<<30;const int maxed=1000+10;bool used[maxed];int n,m,ma[maxed],mb[maxed],Ma[maxed],Mb[maxed],dis;vector<int> ve[maxed];int main(){    bool slove1();    bool slove2(int);    fill(Ma,Ma+n,-1);    fill(Mb,Mb+m,-1);    int ans=0;    while(slove1()){        fill(used,used+n,false);        for(int i=0;i<n;i++)            if(Ma[i]==-1&&slove2(i))                ans++;    }    printf("%d\n",ans);    return 0;}bool slove1(){    dis=INF;    fill(ma,ma+n,-1);    fill(mb,mb+m,-1);    queue<int> qu;    for(int i=0;i<n;i++)        if(Ma[i]==-1){            ma[i]=0;            qu.push(i);        }    while(!(qu.empty())){        int q=qu.front();        qu.pop();        if(ma[q]>dis)            break;        int len=ve[q].size();        for(int i=0;i<len;i++){            int x=ve[q][i];            if(mb[x]==-1){                mb[x]=ma[q]+1;                if(Mb[x]==-1)                    dis=mb[x];                else{                    ma[Mb[x]]=mb[x]+1;                    qu.push(Mb[x]);                }            }        }    }    return dis!=INF;}bool slove2(int x){    int len=ve[x].size();    for(int i=0;i<len;i++){        int w=ve[x][i];        if(!used[w]&&mb[w]==ma[x]+1){            used[w]=true;            if(Mb[w]!=-1&&mb[w]==dis)                continue;            if(Mb[w]==-1||slove2(Mb[w])){                Ma[x]=w;                Mb[w]=x;                return true;            }        }    }    return false;}
匈牙利:

#include<iostream>#include<cstdio>using namespace std;const int maxed=1000+10;bool used[maxed],p[maxed][maxed];int n,m,d[maxed];int main(){    bool slove(int);    fill(d,d+m,-1);    int ans=0;    for(int i=0;i<n;i++){        fill(used,used+n,false);        if(slove(i))            ans++;    }    printf("%d\n",ans);    return 0;}bool slove(int x){    for(int i=0;i<m;i++){        if(p[x][i]&&!used[i]){            used[i]=true;            if(d[i]==-1||slove(d[i])){                d[i]=x;                return true;            }            used[i]=false;        }    }    return false;}