hdu 2119 Matrix 二分图 最小点覆盖

来源:互联网 发布:数据库的基本对象是 编辑:程序博客网 时间:2024/04/29 06:34

题目链接


大意:给你一个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);   #endifwhile( 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;}


0 0
原创粉丝点击