二分图入门(一)

前言:

由于二分图以及网络流不是我负责,所以随便学点模板和结论算了。暂时不刷专题。大概碰到一道解决一道的样子。。

二分图最大匹配:

模板题

模板:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define vi vector<int>
#define vll vector<ll>
const int maxn = 500 + 5;
const int mod = 1e9 + 7;
vi e[maxn];
int n , m , ed , match[maxn] , bk[maxn];
bool dfs (int u)
{
    
    
    for (auto v : e[u]){
    
    
        if (bk[v]) continue;
        bk[v] = 1;
        if (match[v] == 0 || dfs(match[v])){
    
    
            match[v] = u;
            return true;
        }
    }
    return false;
}
int main()
{
    
    
    ios::sync_with_stdio(false);
    cin >> n >> m >> ed;
    for (int i = 1 ; i <= ed ; i++){
    
    
        int x , y; cin >> x >> y;
        e[x].pb(y);
    }
    int ans = 0;
    for (int i = 1 ; i <= n ; i++){
    
    
        memset(bk , 0 , sizeof bk);
        dfs(i);
    }
    for (int i = 1 ; i <= m ; i++){
    
    
        ans += (match[i] != 0);
    }
    cout << ans << endl;
    return 0;
}

结论:

1.二分图最大独立集:选最多的点,满足两两之间没有边相连。

二分图中,最大独立集 =- 最大匹配。

2.二分图最小点覆盖:选最少的点,满足每条边至少有一个端点被选,不难发现补集是独立集。
二分图中,最小点覆盖 =- 最大独立集。

猜你喜欢

转载自blog.csdn.net/qq_35577488/article/details/114640164
今日推荐