1. 程式人生 > >備戰NOIP——模板複習13

備戰NOIP——模板複習13

這裡只有模板,並不作講解,僅為路過的各位做一個參考以及用做自己複習的資料,轉載註明出處。

二分圖匹配

匈牙利演算法

/*Copyright: Copyright (c) 2018
*Created on 2018-11-02  
*Author: 十甫
*Version 1.0 
*Title: 匈牙利演算法
*Time: inf mins
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 10005;
const int maxm = 100005;

int to[maxn][maxn], n, m, e;
int matchx[maxn], matchy[maxn];
bool vis[maxn];
bool dfs(int u) {
    for(int v = n + 1;v <= n + m;v++) if(to[u][v]) {
        if(vis[v]) continue;
        vis[v] = true;
        if(!matchy[v] || dfs(matchy[v])) {
            matchx[u] = v, matchy[v] = u;
            return true;
        }
    }
    return false;
}

int main() {
    scanf("%d%d%d", &n, &m, &e);
    for(int i = 1;i <= e;i++) {
        int a, b;
        scanf("%d%d", &a, &b);
        if(a < 1 || a > n || b < 1 || b > m) continue;
        to[a][b + n] = to[b + n][a] = true;
    }
    int ans = 0;
    for(int i = 1;i <= n;i++) {
        if(!matchx[i]) {
            memset(vis, false, sizeof(vis));
            ans += dfs(i);
        }
    }
    printf("%d\n", ans);
    return 0;
}