【题目链接】 http://poj.org/problem?id=2226

【题目大意】

  给出一张图,上面有泥和草地,有泥的地方需要用1*k的木板覆盖,
  有草地的地方不希望被覆盖,问在此条件下需要的最少木板数目

【题解】

  我们将四周都当成草地,将每块草地拆成横向点和纵向点
  对于每一块泥地,我们将其向左和向上遇到的第一块草地连线,
  对于这个图的最小点覆盖就是答案,而最小点覆盖等于二分图的最大匹配,
  因此我们做一遍最大匹配即可

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int MAX_V=10000;
int V,match[MAX_V];
vector<int> G[MAX_V];
bool used[MAX_V];
void add_edge(int u,int v){
G[u].push_back(v);
G[v].push_back(u);
}
bool dfs(int v){
used[v]=1;
for(int i=0;i<G[v].size();i++){
int u=G[v][i],w=match[u];
if(w<0||!used[w]&&dfs(w)){
match[v]=u;
match[u]=v;
return 1;
}
}return 0;
}
int bipartite_matching(){
int res=0;
memset(match,-1,sizeof(match));
for(int v=0;v<V;v++){
if(match[v]<0){
memset(used,0,sizeof(used));
if(dfs(v))res++;
}
}return res;
}
const int MAX_N=60;
char mp[MAX_N][MAX_N];
int g[MAX_N][MAX_N][2];
int T,N,M;
void init(){
memset(g,0,sizeof(g));
for(int i=0;i<N;i++){
scanf("%s",mp[i]);
}
}
void solve(){
int mark=1,cnt=0;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
if(mp[i][j]=='.')g[i][j][0]=-1,cnt++;
else g[i][j][0]=cnt,mark=1;
}if(mark)cnt++;
}
for(int j=0;j<M;j++){
mark=0;
for(int i=0;i<N;i++){
if(mp[i][j]=='.')cnt++;
else g[i][j][1]=cnt,mark=1;
}if(mark)cnt++;
}
for(int i=0;i<N;i++){
for(int j=0;j<M;j++)if(~g[i][j][0]){
add_edge(g[i][j][0],g[i][j][1]);
}
}V=cnt;
printf("%d\n",bipartite_matching());
for(int i=0;i<=V;i++)G[i].clear();
}
int main(){
while(~scanf("%d%d",&N,&M)){
init();
solve();
}return 0;
}

最新文章

  1. 关于Openlayer3的菜鸟认识
  2. Jacoco入门
  3. hadoop-cdh with snappy
  4. ASP.NET的票据工具类FormsAuthenticationTicket
  5. PHP 实现下载文件的方法
  6. Android源代码编译——编译
  7. HDOJ-ACM1061(JAVA) Rightmost Digit
  8. RobotFramework+Selenium2library+Appium+Python+RIDE安装指南
  9. 光盘卡在MacBook里退不出来咋办?
  10. SSH-Struts(两)—调节器(ActionServlet)
  11. Android OpenGL ES(二)OpenGL ES管道(Pipeline) .
  12. Android基础工具函数代码集
  13. 分享几个有趣的Linux命令
  14. Lottie 动画
  15. Java学习——用户电话输入显示
  16. ES使用org.elasticsearch.client.transport.NoNodeAvailableException: No node available 错误解决方法
  17. .Net微服务架构之运行日志分析系统
  18. linux常用命令:ifconfig 命令
  19. Windows7安装JDK的环境变量设置javac不是内部命令或外部命令
  20. 【Apache】ab工具

热门文章

  1. 近期对于windows服务的理解
  2. WCF分布式开发步步为赢(15):错误契约(FaultContract)与异常处理(ExceptionHandle)
  3. 使用记事本创建Web服务(WebService)
  4. auto login vpnclient bat
  5. MVC 自定义HtmlHelper帮助类型之分页
  6. Python基础(5)_文件操作
  7. [bzoj1486][HNOI2009]最小圈——分数规划+spfa+负环
  8. POJ3264(线段树求区间最大最小值)
  9. 搭建 Linux 下 GitLab 服务器【转】
  10. ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8,A9,A12,A15到Cortex-A53,A57【转】