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

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

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

//链式前向星+匈牙利算法
#include

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;
}

附上白书代码:


#include

using namespace std;

const int MAX_V=100;

int V;
vectorG[MAX_V];
int match[MAX_V];
bool used[MAX_V];

void add_edge(int u,int v)
{
    G[u].push_back(v);
    G[v].push_back(u);
}

bool dfs(int v)
{
    used[v]=true;
    for(int i=0;i

 

你可能感兴趣的:(二分图匹配)