二分图匹配(持续更新)

本文介绍了二分图匹配的核心算法——匈牙利算法,它用于寻找最大匹配并适用于没有奇环的一般图。算法的时间复杂度为O(V*E)。通过实例展示了飞行员配对问题,并探讨了最大匹配数与最小点覆盖、最小路径覆盖、最大独立集的关系。此外,还提及了在二维平面上利用坐标构建二分图的常见模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分匹配核心算法:匈牙利算法(增广路算法)

注意:匈牙利算法 也适用于 没有奇环的 一般图的 最大匹配

复杂度: O ( V ∗ E ) O(V*E) O(VE)

飞行员配对方案问题
匈牙利算法模板题:二分图上求最大匹配数

#include "bits/stdc++.h"
using namespace std;
inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;}

const int maxn = 3e5+7;

int n, m;
int head[maxn], to[maxn], nxt[maxn], tot;
int vis[maxn], link[maxn], flag=1;

inline void add_edge(int u, int v) {
    ++tot; to[tot]=v; nxt[tot]=head[u]; head[u]=tot;
}

bool find(int u) {
    for(int i=head[u]; i; i=nxt[i]) {
        int v=to[i];
        if(vis[v]==flag) continue;
        vis[v]=flag;
        if(!link[v]||find(link[v])) {
            link[v]=u;
            return 1;
        }
    }
    return 0;
}

int main() {
    m=read(), n=read();
    int u, v;
    while(scanf("%d%d", &u, &v), u!=-1||v!=-1) add_edge(u,v);
    int cnt=0;
    for(int i=1; i<=m; ++i, ++flag) if(find(i)) cnt++;
    printf("%d\n", cnt);
    for(int i=m+1; i<=m+n; ++i)
        if(link[i]) printf("%d %d\n", link[i], i);
}

二分匹配知识点

  1. 最大匹配数=最小点覆盖
  2. 最小路径覆盖=最大独立集
  3. 最大匹配数+最大独立集=V

常见模型

  1. 在二维平面上将坐标按X,Y当做两个分图, 而坐标则看作分图之间的边;
  2. 有时需要重建X,Y的定义,如HDOJ 1045
  3. 其他类型动动脑子就好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值