标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063
二分匹配最大匹配数简单题,匈牙利算法。学习二分匹配传送门:http://blog.csdn.net/dark_scope/article/details/8880547
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 const int N = 1e3 + 5; 7 struct Edge { 8 int to , next; 9 }edge[N]; 10 int head[N] , match[N] , cnt; //match 右集合对应左集合的编号 11 bool vis[N]; 12 13 void init() { 14 memset(head , -1 , sizeof(head)); 15 memset(match , 0 , sizeof(match)); 16 cnt = 0; 17 } 18 19 inline void add(int u , int v) { 20 edge[cnt].next = head[u]; 21 edge[cnt].to = v; 22 head[u] = cnt++; 23 } 24 25 bool dfs(int u) { 26 for(int i = head[u] ; ~i ; i = edge[i].next) { 27 int v = edge[i].to; 28 if(!vis[v]) { //没有查找过 29 vis[v] = true; 30 if(!match[v] || dfs(match[v])) { //没有匹配过 或者试着可以腾出位子来匹配 31 match[v] = u; 32 return true; //匹配成功 33 } 34 } 35 } 36 return false; 37 } 38 39 int hungry(int n) { 40 int res = 0; 41 for(int i = 1 ; i <= n ; ++i) { 42 memset(vis , false , sizeof(vis)); 43 if(dfs(i)) 44 res++; 45 } 46 return res; 47 } 48 49 int main() 50 { 51 int k , n , m , u , v; 52 while(~scanf("%d" , &k) && k) { 53 scanf("%d %d" , &n , &m); 54 init(); 55 for(int i = 0 ; i < k ; ++i) { 56 scanf("%d %d" , &u , &v); 57 add(u , v); 58 } 59 printf("%d\n" , hungry(n)); 60 } 61 return 0; 62 }
标签:
原文地址:http://www.cnblogs.com/Recoder/p/5664117.html