標籤:cstring pre 情況 演算法 scanf targe mat std 整數
日常吐槽:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈今天是這麼久以來唯一一次大爽(?)的日子。我,趙·機智·小機靈鬼兒用十分鐘AC了XXX模板!掌聲鼓勵!
思路照樣見XXX部落格 70175814 反正小機靈鬼兒只是來貼代碼的
例題
洛穀P3386 【模板】二分圖匹配
題目背景
二分圖
題目描述
給定一個二分圖,結點個數分別為n,m,邊數為e,求二分圖最大匹配數
輸入輸出格式
輸入格式:
第一行,n,m,e
第二至e+1行,每行兩個正整數u,v,表示u,v有一條連邊
輸出格式:
共一行,二分圖最大匹配
輸入輸出範例
輸入範例#1:
1 1 11 1
輸出範例#1:
1
說明
n, m小於等於 1000,u和v分別為小於n、m的正整數。
因為資料有坑,可能會遇到 v>m 的情況。請把 v>m 的資料自覺過濾掉。
代碼
#include<cstdio>#include<iostream>#include<cstring>using namespace std;int n, m, p, tot = 0, ans = 0;int a[1001], b[1001], t[1001][1001], vis[1001];int dfs(int u){ for (int v = 1; v <= m; v++) if (t[u][v] && !vis[v]) { vis[v] = 1; if (!b[v] || dfs(b[v])) { a[u] = v; b[v] = u; return 1; } } return 0;}void maxmatch(){ for (int i = 1; i <= n; i++) if (!a[i]) { memset(vis, 0, sizeof vis); ans += dfs(i); } printf("%d\n", ans);}int main(){ memset(a, 0, sizeof a); memset(b, 0, sizeof b); memset(t, 0, sizeof t); scanf("%d%d%d", &n, &m, &p); for (int i = 1; i <= p; i++) { int x, y; scanf("%d%d", &x, &y); if (x > n || y > m) continue; tot++; t[x][y] = 1; } maxmatch(); return 0;}
二分圖匹配——匈牙利演算法