BZOJ1191
-
题目
-
分析
由题意可知,可以从二分图考虑建模。
以题目为左部顶点,锦囊为右部顶点。根据题目要求题目和锦囊连边即可。注意当当前点没有增广路时,跳出循环。
-
代码
const int N = 1005; const int M = 1e6 + 5; int n, m, tot; int head[N], Next[M], ver[M], visit[N]; int match[N]; int ans ; void add(int x, int y) { ver[++tot] = y, Next[tot] = head[x], head[x] = tot; } bool dfs(int x) { for (int i = head[x], y; i; i = Next[i]) if (!visit[y = ver[i]]) { visit[y] = 1; if (!match[y] || dfs(match[y])) { match[y] = x; return true; } } return false; } int main () { read(n); read(m); for (int i = 1; i <= m; i++) { int x, y; read(x); read(y); add(i, x); add(i, y); } for (int i = 1; i <= n; i++) { memset(visit, 0, sizeof(visit)); if (dfs(i)) ans++; else break; } cout << ans << endl; return 0; }
-
题型
二分图匹配