zoukankan      html  css  js  c++  java
  • 二分图笔记

    二分图 <=> 不存在奇环

    二分图判定:黑白染色

    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算法

     

  • 相关阅读:
    POJ 3279 Fliptile
    FZU 2143 Board Game
    【HDU 5015】233 Matrix
    【BZOJ 2463】 谁能赢呢?
    【POJ 2311】 Cutting Game
    【HDU 1846】 Brave Game
    【HDU 1847】 Good Luck in CET-4 Everybody!
    【Codeforces 258D】 Count Good Substrings
    【Codeforces 258B】 Sort the Array
    【Codeforces 258A】 Game With Sticks
  • 原文地址:https://www.cnblogs.com/Maxx-el/p/14073034.html
Copyright © 2011-2022 走看看