图论:二分图最大匹配(匈牙利算法)

邻接矩阵:

点击查看折叠代码块
int n,m;//V1中的点数,V2中的点数
bool used[MAXN];
int line[MAXN][MAXN];//line != 0 表示存在这条边
int girl[MAXN];

bool find(int x){//递归过程
    for (int j=1;j<=m;j++){
        if(line[x][j] && !used[j]){
            used[j]=1;
            if(girl[j]==0 || find(girl[j])){
                girl[j]=x;
                return true;
            }
        }
    }
    return false;
}

int ans=0;//匹配数
void MATCH(){//求最大匹配
    for (int i=1;i<=n;i++){
        memset(used,0,sizeof(used));
        if(find(i)) ans++;
    }
}

前向星:

点击查看代码块
int head[maxn],cnt = 0;
struct edge{
    int u,v,next;
}e[maxn<<2];
bool vis[maxn];
int mh[maxn];

int solve(int x){
    for (int i=head[x];~i;i=e[i].next){
        int v=e[i].v;
        if(!vis[v]){
            vis[v] = 1;
            if(mh[v] == 0 || solve(mh[v])){
                mh[v] = x;
                return 1;
            }
        }
    }
    return 0;
}

int match(int n){
    int ans = 0;
    for (int i=1;i<=n;i++){
        memset(vis,0,sizeof(vis));
        ans += solve(i);
    }
    return ans;
}
你将不再是道具,而是成为人如其名的人
原文地址:https://www.cnblogs.com/wsl-lld/p/13393565.html