博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2119 Matrix 二分图
阅读量:4583 次
发布时间:2019-06-09

本文共 1379 字,大约阅读时间需要 4 分钟。

题目链接:

题意很好理解,就是每次可以删除一行或者一列数,问最少几次可以把所有的1都变成0,也就是都删完。

利用二分图解

行表示二分图的一部分,列表示一部分,为1的点表示连一条边,然后求最小顶点覆盖数。

最小顶点覆盖即表示用最少的顶点把所有的边都关联到。
最小顶点覆盖 = 最大匹配。
 
此外二分图还有最小路径覆盖,意思是用最少的边把图中所有的顶点都遍历到。
最小路径覆盖 = 顶点数 - 最大匹配。

View Code
1 #include 
2 #include
3 #include
4 using namespace std; 5 const int MAX=105; 6 int map[MAX][MAX]; 7 int visit[MAX]; 8 int use[MAX]; 9 int n,m;10 int solve(int x)11 {12 int j;13 for(j=1;j<=m;j++)14 {15 if(map[x][j]&&!visit[j])16 {17 visit[j]=1;18 if(use[j]==-1||solve(use[j]))19 {20 use[j]=x;21 return 1;22 }23 }24 }25 return 0;26 }27 int match()28 {29 int i,count=0;30 for(i=1;i<=n;i++)31 {32 memset(visit,0,sizeof(visit));33 if(solve(i))count++;34 }35 return count;36 }37 int main()38 {39 int x,i,j;40 while(scanf("%d",&n)&&n)41 {42 memset(use,-1,sizeof(use));43 memset(map,0,sizeof(map));44 45 scanf("%d",&m);46 for(i=1;i<=n;i++)47 for(j=1;j<=m;j++)48 {49 scanf("%d",&x);50 if(x) map[i][j]=1;51 }52 x=match();53 printf("%d\n",x);54 }55 return 0;56 }

 

转载于:https://www.cnblogs.com/zhaoguanqin/archive/2012/05/07/2487446.html

你可能感兴趣的文章
鼠标事件(jQuery)
查看>>
delete指针时coredump的分析之旅
查看>>
openoffice+pdf2swf+FlexPaper在线显示office和pdf
查看>>
24-React Components组件
查看>>
[BZOJ 1188] [HNOI2007] 分裂游戏 【博弈论|SG函数】
查看>>
[BZOJ - 2631] tree 【LCT】
查看>>
ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程...
查看>>
JS实现数组排序:升序和降序
查看>>
怎样写具体设计文档
查看>>
CAShapeLayer
查看>>
ACM_夏天到了,又到了出游的季节
查看>>
【转载】HTTP 错误 500.19 - Internal Server Error
查看>>
2015 Multi-University Training Contest 3 hdu 5325 Crazy Bobo
查看>>
SQL Server 存储图片
查看>>
php特级课---4、网站服务监控(常用网站服务监控软件有哪些)
查看>>
ubuntu14.04 boost 1.58.0 安裝
查看>>
漏洞基本概念
查看>>
直角三角形 (Standard IO)
查看>>
web 12
查看>>
Centos7安装Nginx
查看>>