Hopcroft-Karp算法模板

来源:互联网 发布:淘宝色差问题怎么回复 编辑:程序博客网 时间:2024/05/16 18:27

http://blog.csdn.net/u011742541/article/details/14104573


//Hopcroft-Karp算法 有点类似dinic 都是先对图BFS分层再沿层数DFS找增广路    //***************************************************************************    bool searchPath()        //BFS 对二分图分层    {      dist = inf;      queue<int>que;      memset( dx,-1,sizeof(dx) );      memset( dy,-1,sizeof(dy) );      for( int i = 1; i <= nx; i ++ ){  //找到x集合所有未被匹配的点压入队列中          if( cx[i] == -1 ){              que.push(i);              dx[i] = 0;          }      }      while( !que.empty() ){          int u = que.front(); que.pop();          if( dx[u] > dist )    //只分层到第一个找个的可匹配点层数              break;          for( int v = 1; v <= ny; v ++ ) {              if( map[u][v] && dy[v] == -1 ){                  dy[v] = dx[u] + 1;                  if( cy[v] == -1 )      //找个一个可以匹配点 标记分层的层数                       dist = dy[v];                  else{                      dx[cy[v]] = dy[v] + 1;                      que.push( cy[v] );                  }              }          }      }      return dist != inf;          }  bool findPath( int u )    //沿着层数DFS    {      for( int v = 1; v <= ny; v ++ ){          if( map[u][v] && !vis[v] && dy[v] == dx[u] + 1 ){              vis[v] = true;              if( cy[v] != -1 && dy[v] == dist  )    //如果v已经有匹配了且v的层数为dist( 最大层数为dist 所以v原来匹配的不可能再匹配 )                  continue;              if( cy[v] == -1 || findPath( cy[v] ) ){   //如果v未匹配就跟u匹配v 否则看v原来匹配的是否还能跟其他的匹配 能就跟u匹配 不能就不匹配                   cy[v] = u;                  cx[u] = v;                  return true;              }          }      }      return false;  }  int HK_MaxMatch()  {      int ans = 0;      memset( cx,-1,sizeof(cx) );      memset( cy,-1,sizeof(cy) );      while( searchPath() ){   //分层 + 判断是否还有未匹配点          memset( vis,0,sizeof(vis) );          for( int i = 1; i <= nx; i ++ ){                if( cx[i] == -1 )                  ans += findPath(i);          }      }      return ans;  }  //***************************************************************************   


原创粉丝点击