備戰NOIP——模板複習13
阿新 • • 發佈:2018-12-19
這裡只有模板,並不作講解,僅為路過的各位做一個參考以及用做自己複習的資料,轉載註明出處。
二分圖匹配
匈牙利演算法
/*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; }