学了匈牙利算法。
匈牙利算法核心是找增广路经。
可以求出二分图的最大匹配数。
感觉还是挺好理解的。
时间复杂度 邻接矩阵: 邻接表:
空间复杂度 邻接矩阵: 邻接表:
看的这个blog,有些恶趣味。(受不了凤姐那张图。。)
——代码
1 #include <cstdio> 2 #include <cstring> 3 4 using namespace std; 5 6 int n, m, k, cp, cnt; 7 int girl[10010], to[1000001], next[1000001], head[10010]; 8 //girl[i]记录第i个girl所属的boy 9 bool dog[10010]; 10 //dog[i]记录i是否脱单 11 12 inline void add(int x, int y) 13 { 14 to[cnt] = y; 15 next[cnt] = head[x]; 16 head[x] = cnt++; 17 } 18 19 int find_girl(int u) 20 { 21 int i, v; 22 for(i = head[u]; i != -1; i = next[i])//找所有有好感的对象 23 { 24 v = to[i]; 25 if(!dog[v]) 26 //单身(这里标记的意思是这次查找曾试图改变过该妹子的归属问题,但是没有成功,所以就不用瞎费工夫了) 27 { 28 dog[v] = 1; 29 if(!girl[v] || find_girl(girl[v]))//名花无主或者能腾出个位置来 30 { 31 girl[v] = u; 32 return 1; 33 } 34 } 35 } 36 return 0; 37 } 38 39 int main() 40 { 41 int i, j, x, y; 42 scanf("%d %d %d", &n, &m, &k); 43 memset(head, -1, sizeof(head)); 44 for(i = 1; i <= k; i++) 45 { 46 scanf("%d %d", &x, &y); 47 if(x > n || y > m) continue; 48 add(x, y);//有暧昧关系 49 } 50 for(i = 1; i <= n; i++) 51 { 52 memset(dog, 0, sizeof(dog)); 53 if(find_girl(i)) cp++; 54 } 55 printf("%d", cp); 56 return 0; 57 }