二分图笔记

二分图 <=> 不存在奇环

二分图判定:黑白染色

CF构造题

 http://www.renfei.org/blog/bipartite-matching.html

一、二分图的最大匹配问题

匈牙利算法

int n;
int a[maxn][maxn];  //互相喜欢
int link[maxn];  //第i个女生的男伴是谁
bool vis[maxn];  //表示第i个女生有没有在这一次找搭档过程中被邀请

bool dfs(int x) //给第x个男生找搭档
{
    for(int i = 1; i <= n; ++i)  //遍历每个女生
    {
        if(!a[x][i] || vis[i]) continue;
        vis[i] = 1;
        if(link[i] == 0 || dfs(link[i]))  //直接匹配或者给第i个女生的男伴重新找一个搭档
        {
            link[i] = x;
            return 1;
        }
    }
    return 0;
}
int main() {
    cin >> n;
    int cnt = 0;
    for (int i = 1; i <= n; ++i) //遍历每个男生 尝试找搭档
    {
        memset(vis, 0, sizeof(vis));
        if(dfs(i)) ++cnt;    //统计一共找到多少对
    }
}

 

复杂度:

邻接矩阵:O(n^3)

邻接表:O(nm)

 

最大匹配数:最多匹配的对数(每个顶点最多被一条边覆盖)

最小点覆盖数:每个点覆盖以它为端点的所有边,选择最少的点来覆盖所有边

 二分图的最大匹配数等于该图的最小点覆盖数

对于匹配的每一对,都选择一个顶点进行覆盖,此时其实已经覆盖完所有边了,因为若有一条边没有被覆盖,那么它就是一个新的匹配,加入,再被覆盖。

 

二、二分图最优匹配----KM算法

 

 

 

 

 

 

posted @ 2020-12-07 12:49  .Ivorelectra  阅读(49)  评论(0编辑  收藏  举报