hdu 2119 Matrix 二分图 最小点覆盖
2014-07-17 19:59
267 查看
题目链接
大意:给你一个0/1矩阵,以及一把枪,一枪可以打掉同一行或者同一列上的1,问你最少几次可以把1全部变为0?
思路:我们以x,y轴为顶点建立二分图,如果数字为1的话,那么就连一条边,其实就转换成了最小顶点覆盖的问题,然后求二分最大匹配即可.
大意:给你一个0/1矩阵,以及一把枪,一枪可以打掉同一行或者同一列上的1,问你最少几次可以把1全部变为0?
思路:我们以x,y轴为顶点建立二分图,如果数字为1的话,那么就连一条边,其实就转换成了最小顶点覆盖的问题,然后求二分最大匹配即可.
#include <stdio.h> #include <string.h> #include <math.h> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; const int maxn = 205; const int Mod = 1000000007; int n,m; bool vis[maxn]; int cx[maxn],cy[maxn]; int map[maxn][maxn]; int findpath( int u ) { for( int i = 1; i <= m; i ++ ) { if( map[u][i] && !vis[i] ) { vis[i] = 1; if( cy[i] == -1 || findpath( cy[i] ) ) { cy[i] = u; cx[u] = i; return true; } } } return false; } int MaxMatch() { int ans = 0; memset( cx,-1,sizeof(cx) ); memset( cy,-1,sizeof(cy) ); for( int i = 1; i <= n; i ++ ) { if( cx[i] == -1 ) { memset( vis,0,sizeof(vis) ); ans += findpath( i ); } } return ans; } int main() { #ifndef ONLINE_JUDGE freopen("data.txt","r",stdin); #endif while( scanf("%d",&n) != EOF,n ) { scanf("%d",&m); memset(map,0,sizeof(map)); for( int i = 1; i <= n; i ++ ) { for( int j = 1; j <= m; j ++ ) { scanf("%d",&map[i][j]); } } printf("%d\n",MaxMatch()); } return 0; }
相关文章推荐
- HDU 2119--Matrix【二分图 && 最小点数覆盖】
- HDU 2119 Matrix【二分图之最小点集覆盖】
- HDU 2119 Matrix 二分图最小点覆盖
- HDU - 2119 - Matrix - 二分图最小覆盖 - 或Dancing Links
- HDU 2119 Matrix(二分图最小边覆盖)
- HDU 2119 Matrix(二分图最小顶点覆盖)
- HDU 2119 Matrix(二分图最小边覆盖)
- HDU 2119 Matrix [二分图匹配之最小覆盖]
- hdu 2063 过山车 + hdu 2119 Matrix (二分图的最大匹配边和最小覆盖点)
- hdu 2119 Matrix【最小点覆盖-二分匹配】
- hdu 2119 Matrix (最小覆盖)
- hdu 2119 Matrix (最小覆盖)
- HDU 2119 Matrix 最小点覆盖
- hdu2119—Matrix(最小点覆盖)
- hdu 2119 Matrix (最小覆盖)
- 【uva 12549】Sentry Robots HDU 2119 (hdu 2119Matrix升级版) 最小点覆盖+二分图匹配
- hdu Matrix(二分图的最小路径覆盖)
- hdu1150 Machine Schedule (二分图的最小顶点覆盖)
- hdu 1151二分图最小路径覆盖
- hdu 1498 二分图—最小点覆盖