pku3041 Asteroids
http://poj.org/problem?id=3041
二分图最大匹配,匈牙利算法(dfs+邻接矩阵),König定理
König定理:最大匹配数 == 最小点覆盖数
matrix67大神的证明:http://www.matrix67.com/blog/archives/116
好像喜欢上用girl命名右集合数组了。。。
1 #include <stdio.h> 2 #include <string.h> 3 #define N 521 4 5 int k, n; 6 int map[N][N], girl[N], flag[N]; 7 8 int find(int x) 9 { 10 int i; 11 for(i=1; i<=n; 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 main() 27 { 28 int i, sum, a, b; 29 memset(map, 0, sizeof(map)); 30 memset(girl, -1, sizeof(girl)); 31 scanf("%d%d", &n, &k); 32 for(i=0; i<k; i++) 33 { 34 scanf("%d%d", &a, &b); 35 map[a][b] = 1; 36 } 37 sum = 0; 38 for(i=1; i<=n; i++) 39 { 40 memset(flag, 0, sizeof(flag)); 41 sum += find(i); 42 } 43 printf("%d\n", sum); 44 return 0; 45 }