欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二分图匹配(匈牙利算法)

程序员文章站 2022-06-20 09:02:50
...

本质:利用增广路进行最大二分图匹配

代码实现:链式前向星+匈牙利算法

//链式前向星+匈牙利算法
#include<bits/stdc++.h>

using namespace std;

const int maxn=150;
const int maxm=150;

struct edge{
    int end;
    int next;
};
edge edges[maxm];

int n,m,eid,p[maxm],match[maxn];
bool vis[maxn];

void insert(int u,int v)
{
    edges[eid].end=v;
    edges[eid].next=p[u];
    p[u]=eid++;
}

int dfs(int u)
{
    for(int i=p[u];i!=-1;i=edges[i].next){
        int v=edges[i].end;
        if(!vis[v]){
            vis[v]=true;
            if(!match[v]||dfs(match[v])){
                match[v]=u;
                return true;
            }
        }
    }
    return false;
}

int main()
{
    scanf("%d%d",&n,&m);
    int a,b;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&a,&b);
        insert(a,b);
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        memset(vis,false,sizeof(vis));
        if(dfs(i)){
            ans++;
        }
    }
    printf("%d\n",ans);
    return 0;
}

 

相关标签: graph