POJ2226 不错的最小顶点覆盖
题意:
给你一个n * m 的矩阵,上面有" * " 和 " . " ,让你用少的木板吧所有" * "覆盖,木板宽度是1,长度随意,木板可以重叠,但是不能覆盖到" . "上。
思路:
这个题目建图方式不错,回想下最基本的最小定点覆盖,也是在n * m 的矩阵上,覆盖某些点,但是可以覆盖" . "那样直接匹配行列就行了,这个如果是***.***就得用两个了,那我们可以直接把所有的行都离散化出来,吧所有的列都离散化出来,比如
*.*. 按照行离散成 1.2. 按照列离散成 1 . 4 .
.*** .333 . 3 4 5
***. 444. 2 3 4 .
..*. ..5. . . 4 .
接下来就直接正常行列匹配就行了("*"所在的行和列匹配)。
#include<stdio.h>
#include<string.h>#define N_node 3000
#define N_edge 6000typedef struct
{int to ,next;
}STAR;typedef struct
{int r ,l;
}NODE;STAR E[N_edge];
NODE map[60][60];
int mk_dfs[N_node] ,mk_gx[N_node];
int list[N_node] ,tot;
int mp[60][60];void add(int a ,int b)
{E[++tot].to = b;E[tot].next = list[a];list[a] = tot;
}int DFS_XYL(int x)
{for(int k = list[x] ;k ;k = E[k].next){int to = E[k].to;if(mk_dfs[to]) continue;mk_dfs[to] = 1;if(mk_gx[to] == -1 || DFS_XYL(mk_gx[to])){mk_gx[to] = x;return 1;}}return 0;
}int main ()
{int n ,m ,i ,j ,maxr;char str[60];while(~scanf("%d %d" ,&n ,&m)){memset(mp ,0 ,sizeof(mp));for(i = 1 ;i <= n ;i ++){scanf("%s" ,str);for(j = 1 ;j <= m ;j ++)mp[i][j] = str[j-1] == '*';}int now = 0;memset(map ,0 ,sizeof(map));for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= m ;j ++){if(!mp[i][j]) {map[i][j].r = 0;continue;}if(mp[i][j] && !mp[i][j-1])map[i][j].r = ++now;else map[i][j].r = map[i][j-1].r;}maxr = now;now = 0;for(j = 1 ;j <= m ;j ++)for(i = 1 ;i <= n ;i ++){if(!mp[i][j]){map[i][j].l = 0;continue;}if(mp[i][j] && !mp[i-1][j])map[i][j].l = ++now;else map[i][j].l = map[i-1][j].l;}memset(list ,0 ,sizeof(list));tot = 1;for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= m ;j ++)if(map[i][j].r && map[i][j].l)add(map[i][j].r ,map[i][j].l);int sum = 0;memset(mk_gx ,255 ,sizeof(mk_gx));for(i = 1 ;i <= maxr ;i ++){memset(mk_dfs ,0 ,sizeof(mk_dfs));sum += DFS_XYL(i);}printf("%d\n" ,sum);}return 0;
}
POJ2226 不错的最小顶点覆盖相关推荐
- poj2226(最小顶点覆盖)
(相当于是poj3041的进阶版,不过难度还好) 题目大概意思为将一个矩阵中的泥泞部分给覆盖起来,可以横着覆盖也可以竖着覆盖,但不能覆盖到其他草地部分,覆盖的板子长度随意,宽度为1,可以重复覆盖,求最 ...
- 最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)
在讲述这两个算法之前,首先有几个概念需要明白: 二分图: 二分图又称二部图,是图论中的一种特殊模型.设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边( ...
- [poj3041]Asteroids(二分图的最小顶点覆盖)
题目大意:$N*N$的网格中有$n$颗行星,若每次可以消去一整行或一整列,求最小的攻击次数使得消去所有行星. 解题关键:将光束当做顶点,行星当做连接光束的边建图,题目转化为求该图的最小顶点覆盖,图的最 ...
- POJ3041 最小顶点覆盖
题意: 给你一个n * n 的矩阵,和X所在的坐标,问你最少放多少个**可以把图里的所有X都覆盖,每个**可以覆盖一行,或者一列. 思路: 最小顶点覆盖,最小顶点覆盖=二分匹配 ...
- hdu 1054(最小顶点覆盖)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 思路:最小顶点覆盖 == 最大匹配(双向图)/2...不过一开始是用邻接矩阵,傻傻的TLE... ...
- hdu 1498(二分图最小顶点覆盖)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1498 解题思路: 这题看上去很和二分图的最小顶点覆盖很相似,但关键怎么处理多个不同颜色的气球. 其实就 ...
- HDU1054+最小顶点覆盖
View Code /* 最小顶点覆盖:选出最少的点,这些点的关联的边都被覆盖 最小顶点覆盖等于最大匹配*/ #include<stdio.h> #include<stdlib.h& ...
- 【每日算法】【图论】【最小边覆盖 最小路径覆盖 最小顶点覆盖 最大独立集 最大团】
最小边覆盖 = 最大独立集 = |V| - 最大匹配数 这个是在原图是二分图上进行的 最小路径覆盖和最小边覆盖不同,不要求给的图是二分图,而是要求是N x N的有向图,不能有环,然后根据原图构造二分图 ...
- hdu1054(最小顶点覆盖)
传送门:Strategic Game 题意:用尽量少的顶点来覆盖所有的边. 分析:最小顶点覆盖裸题,最小顶点覆盖=最大匹配数(双向图)/2. #include <cstdio> #incl ...
最新文章
- html产品列表页的设计,产品列表页.html
- SpringCloud实战5-Feign声明式服务调用
- After Effects 2019 CC for mac下载安装激活步骤演示
- Pyhton为什么这么厉害?无意中从一道奥数题发现Python真的爽翻了
- 过年战胜熊孩子骚扰的终极攻略,拿走不谢!
- HDU2091 空心三角形【打印图案】
- 硕博士学位论文参考文献Endnote格式分享
- 这8行代码的惊艳与反思
- Windows Server 2016-Win Ser 2016已删减内容
- 加权voronoi图 matlab,加权voronoi图matlab
- excel表格两个表格合并
- NYNU_ACM 实验室招新月赛题解
- windows 10 arm架构ISO下载
- OpenCV笔记:模板匹配 cv2.matchTemplate()、cv2.minMaxLoc() 与 绘制矩形 cv2.rectangle() 方法介绍
- 计算机电路板 接地,pcb电路板接地怎么接
- bzoj-1031 字符加密Cipher
- mysql数据库1067错误解决方法
- Python——习题:生成银行卡号和密码
- Windows API编程(一)最基础的知识介绍:Windows编程基础
- Ecology Letters:生物多样性的多维性、尺度依赖性及稀疏曲线的深度认知