Advertisement
MarioYC

bipartite

Aug 1st, 2012
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.13 KB | None | 0 0
  1. #define MAX_V1 50000
  2. #define MAX_V2 50000
  3. #define MAX_E 150000
  4.  
  5. int V1,V2,left[MAX_V2],right[MAX_V1];
  6. int E,to[MAX_E],next[MAX_E],last[MAX_V1];
  7.  
  8. void hk_init(int v1, int v2){
  9.     V1 = v1; V2 = v2; E = 0;
  10.     memset(last,-1,sizeof last);
  11. }
  12.  
  13. void hk_add_edge(int u, int v){
  14.     to[E] = v; next[E] = last[u]; last[u] = E++;
  15. }
  16.  
  17. bool visited[MAX_V1];
  18.  
  19. bool hk_dfs(int u){
  20.     if(visited[u]) return false;
  21.     visited[u] = true;
  22.    
  23.     for(int e = last[u],v;e != -1;e = next[e]){
  24.         v = to[e];
  25.        
  26.         if(left[v] == -1 || hk_dfs(left[v])){
  27.             right[u] = v;
  28.             left[v] = u;
  29.             return true;
  30.         }
  31.     }
  32.    
  33.     return false;
  34. }
  35.  
  36. int hk_match(){
  37.     memset(left,-1,sizeof left);
  38.     memset(right,-1,sizeof right);
  39.     bool change = true;
  40.    
  41.     while(change){
  42.         change = false;
  43.         memset(visited,false,sizeof visited);
  44.        
  45.         for(int i = 0;i < V1;++i)
  46.             if(right[i] == -1)
  47.                 change |= hk_dfs(i);
  48.     }
  49.    
  50.     int ret = 0;
  51.    
  52.     for(int i = 0;i < V1;++i)
  53.         if(right[i] != -1) ++ret;
  54.    
  55.     return ret;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement