哈理工oj(acm.hrbust.edu.cn) 1492【二分图匹配】
二分图匹配,可以将其转化为二分图最小路径覆盖
一个有向无环图的最小路径覆盖=总权-最大匹配数
建图的时候,可以把每个点拆成两个点,如果一个盒子可以放在另一个里面就在其间建立一条边,求出最大匹配,结果即为 n – 匹配数。
裸题,直接套模板就行了,参考《图论算法理论、实现及应用》主编:王桂平 北大出版社。P358 里面讲的非常详细。
View Code
#include<stdio.h> #include<string.h> #define MAXN 500+10 int g[MAXN][MAXN]; int cx[MAXN], cy[MAXN]; bool mk[MAXN]; int n, m; int path(int u) { for(int v = 0; v < n; v++) { if(g[u][v] && !mk[v]) { mk[v] = 1; if(cy[v] == -1 || path(cy[v])) { cx[u] = v; cy[v] = u; return 1; } } } return 0; } int MaxMatch() { int res = 0; memset(cx, -1, sizeof(cx)); memset(cy, -1, sizeof(cy)); for(int i = 0; i < n; i++) { if(cx[i] == -1) { memset(mk, 0, sizeof(mk)); res += path(i); } } return res; } int main() { while(scanf("%d %d", &n, &m) != EOF) { memset(g, 0, sizeof(g)); for(int i = 0; i < m; i++) { int u, v; scanf("%d %d", &u, &v); u--, v--; g[u][v] = 1; } printf("%d\n", n - MaxMatch() ); } return 0; }