pku3692 Kindergarten
http://poj.org/problem?id=3692
二分图匹配,匈牙利算法(dfs+邻接矩阵),最大独立集
最大独立集 == N - 最小点覆盖 == N - 最大匹配数
把没有关系的两点连接,反向建图
1 #include <stdio.h> 2 #include <string.h> 3 4 #define N 210 5 6 int n, m, map[N][N], girl[N], flag[N]; 7 8 int find(int x) 9 { 10 int i; 11 for(i=1; i<=m; i++) 12 { 13 if(!flag[i] && map[x][i]) 14 { 15 flag[i] = 1; 16 if(girl[i]==-1 || find(girl[i])) 17 { 18 girl[i] = x; 19 return 1; 20 } 21 } 22 } 23 return 0; 24 } 25 26 int hungary() 27 { 28 int i, j, sum = 0; 29 for(i=1; i<=n; i++) 30 { 31 for(j=1; j<=m; j++) 32 { 33 flag[j] = 0; 34 } 35 sum += find(i); 36 } 37 return sum; 38 } 39 40 int main() 41 { 42 int i, j, k, cases; 43 for(cases=1; scanf("%d%d%d", &n, &m, &k), n||m||k; cases++) 44 { 45 for(j=1; j<=m; j++) 46 { 47 girl[j] = -1; 48 for(i=1; i<=n; i++) 49 { 50 map[i][j] = 1; 51 } 52 } 53 while(k-- && scanf("%d%d", &i, &j)) 54 { 55 map[i][j] = 0; 56 } 57 printf("Case %d: %d\n", cases, n + m - hungary()); 58 } 59 return 0; 60 }