Hopcroft-Karp算法 二分图最小路径覆盖
2013-11-03 14:01
246 查看
//二分图最小路径覆盖 = 顶点数 - 最大匹配 #include<stdio.h> #include<string.h> #include<queue> using namespace std; const int maxn = 105; const int inf = 1<<30; int nx,ny,m; int dis; int map[maxn][maxn]; int cx[maxn],cy[maxn]; int dx[maxn],dy[maxn]; bool vis[maxn]; //Hopcroft-Karp算法 有点类似dinic 都是先对图BFS分层再沿层数DFS找增广路 //*************************************************************************** bool searchpath() //BFS 对二分图分层 { queue<int>que; dis = inf; 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] > dis ) break; for( int v = 1; v <= ny; v ++ ) { if( map[u][v] && dy[v] == -1 ) { dy[v] = dx[u] + 1; if( cy[v] == -1 ) dis = dy[v]; else { dx[cy[v]] = dy[v] + 1; que.push( cy[v] ); } } } } return dis != 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] = 1; if( cy[v] != -1 && dy[v] == dis ) continue; if( cy[v] == -1 || findpath( cy[v] ) ) { cy[v] = u; cx[u] = v; return true; } } } return false; } int 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; } //**************************************************************** int main() { int t,x,y; scanf("%d",&t ); while( t-- ) { scanf("%d%d",&ny,&m); nx = ny; memset( map,0,sizeof(map) ); for( int i = 1; i <= m; i++ ) { scanf("%d%d",&x,&y); map[x][y] = 1; } printf("%d\n", nx-MaxMatch() ); } }
相关文章推荐
- hdu 4160 Dolls 二分图最小路径覆盖
- 二分图及其匹配算法——最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配
- POJ 2594 二分图最小路径覆盖
- 最小路径覆盖(二分图)
- POJ 1422 Air Raid - 最小路径覆盖(二分图)-易错题
- poj 1422 二分图最小路径覆盖
- 二分图的最大匹配(最小路径覆盖,最小点覆盖)
- POJ 1422-Air Raid(二分图_最小路径覆盖)
- 二分图-最大匹配,最小路径覆盖,最小点覆盖(KM算法)
- HDU 1151 Air Raid(匈牙利算法 二分图的最小路径覆盖 )
- 【二分图|最小路径覆盖】POJ-1422 Air Raid
- 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配(二分图学习)
- POJ 3020 Antenna Placement ,二分图的最小路径覆盖
- poj 2594 二分图最大匹配最小路径覆盖
- 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配
- 二分图最小路径覆盖--poj2060 Taxi Cab Scheme
- POJ 3020 Antenna Placement(二分图最小路径覆盖)
- 二分图之最小路径覆盖 HDU1151
- 二分图(最小路径覆盖)
- 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配