题意:在一个m*n的地图上,有空地,草和墙,其中空地和草能穿透攻击光线,而墙不能。每个机器人能够上下左右攻击,问在地图上最多能放多少个不互相攻击的机器人。

这个题和HDU 1045 -  Fire Net很像。很容易联想到对每个点编号然后互相攻击的点连边再求图的最大独立集,但是这个题数据量太多,超时。

换个思路。

将每个机器人可以攻击到的区域在横和竖方向上分开,这样当横和竖攻击方向都确定时就可以确定一个机器人的放置位置,而在同一个横或竖的攻击区域内不可以再放置机器人。

这样我们把原图上的空地按照每行和每列分别编号。注意隔着墙的空地编号不同,但如果隔着的是草则编号相同。

这样就把原图分成了横和竖两个点集,对于原图上的每个空地位置,即对应两个横和竖方向点的边。我们要让每个攻击区域内至多有一个机器人,就是要让每个点至多和一条边相连,这就是求二分图的最大匹配。用匈牙利算法即可。

 #include<iostream>
 #include<cstring>
 #include<cmath>
 #include<algorithm>
 #include<cstdlib>
 #include<cstdio>
 #include<vector>
 using namespace std;
 ][];
 ][];
 ][],gy[][],nx,ny;
 int m,n;
 ];
 ];
 void init()
 {
     nx=;
     ny=;
     ; i<m; ++i)
     {
         bool v=true;
         ; j<n; ++j)
         {
             if(grid[i][j]=='#') v=true;
             else if(grid[i][j]=='o')
             {
                 if(v) ++nx;
                 gx[i][j]=nx;
                 v=false;
             }
         }
     }
     ; j<n; ++j)
     {
         bool v=true;
         ; i<m; ++i)
         {
             if(grid[i][j]=='#') v=true;
             else if(grid[i][j]=='o')
             {
                 if(v) ++ny;
                 gy[i][j]=ny;
                 v=false;
             }
         }
     }
     memset(gl,,sizeof(gl));
     ; i<m; ++i)
         ; j<n; ++j)
             if(grid[i][j]=='o')
                 gl[gx[i][j]][gy[i][j]]=true;
     memset(link,-,sizeof(link));
 }
 bool match(int x)
 {
     ; i<=ny; ++i)
         if(gl[x][i]&&!vis[i])
         {
             vis[i]=true;
             ||match(link[i]))
             {
                 link[i]=x;
                 return true;
             }
         }
     return false;
 }
 int main()
 {
     ;;
     scanf("%d",&T);
     while(T--)
     {
         scanf("%d%d",&m,&n);
         ; i<m; ++i)
             scanf("%s",grid[i]);
         init();
         ;
         ; i<=nx; ++i)
         {
             memset(vis,,sizeof(vis));
             if(match(i)) ans++;
         }
         printf("Case :%d\n",++kase);
         printf("%d\n",ans);
     }
     ;
 }

ZOJ 1654 - Place the Robots (二分图最大匹配)的更多相关文章

  1. ZOJ 1654 Place the Robots(最大匹配)

    Robert is a famous engineer. One day he was given a task by his boss. The background of the task was ...

  2. zoj1654 Place the Robots 二分图最大匹配

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 将每一行的包含空地的区域编号 再将每一列的包含空地的区域编号 然 ...

  3. ZOJ 1654 Place the Robots(放置机器人)------最大独立集

    Place the Robots http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1654 Time Limit: 5 Sec ...

  4. ZOJ 1654 Place the Robots建图思维(分块思想)+二分匹配

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 AC一百道水题,不如AC一道难题来的舒服. 题意:一个n*m地图 ...

  5. ZOJ 1654 Place the Robots (二分匹配 )

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 Robert is a famous engineer. One ...

  6. ZOJ 1654 Place the Robots

    题目大意: 在空地上放置尽可能多机器人,机器人朝上下左右4个方向发射子弹,子弹能穿过草地,但不能穿过墙, 两个机器人之间的子弹要保证互不干扰,求所能放置的机器人的最大个数 每个机器人所在的位置确定了, ...

  7. ZOJ1654 Place the Robots(二分图最大匹配)

    最大匹配也叫最大边独立集,就是无向图中能取出两两不相邻的边的最大集合. 二分图最大匹配可以用最大流来解. 如果题目没有墙,那就是一道经典的二分图最大匹配问题: 把地图上的行和列分别作为点的X部和Y部, ...

  8. ZOJ 1364 Machine Schedule(二分图最大匹配)

    题意 机器调度问题 有两个机器A,B A有n种工作模式0...n-1 B有m种工作模式0...m-1 然后又k个任务要做 每一个任务能够用A机器的模式i或b机器的模式j来完毕 机器開始都处于模式0 每 ...

  9. POJ 2226二分图最大匹配

    匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...

随机推荐

  1. 使用ar命令删除iOS静态库重复编译的.o文件

    关于 xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误 看这里 http://www.cnblogs.com/cocoajin/p/3917709.ht ...

  2. 获取AVCaptureSession samplebuffer 一像素的 rgb值

    获取AVCaptureSession samplebuffer 一像素的 rgb值 typedef unsigned char byte; typedef struct RGBPixel{ byte ...

  3. centos7 安装mariaDB 以及 phpmyadmin的安装

    centos7 安装mariaDB 以及 phpmyadmin的安装 一:安装mariadb, mariadb 是 mysql 的一个分支,基本和mysql一样的 1. yum -y install ...

  4. mysql设置编码

    1.修改数据库的编码   将数据库(test)的编码方式修改为utf8,如:   ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE ut ...

  5. java中运算符的解析和计算

    package com.LBH; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import j ...

  6. windows7系统配置maven环境

    简介 maven的作用 1.通过在pom.xml配置的方式下载项目所需要的jar包 2.打jar包和打war包 1.环境配置 1.1  http://maven.apache.org/download ...

  7. 20145218 《Java程序设计》第五周学习总结

    20145218 <Java程序设计>第五周学习总结 教材学习内容总结 异常 程序中总有些意想不到的状况所引发的错误,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失 ...

  8. MySQL学习笔记_1_MySQL数据库管理系统概述

    1. MySQL架构 C/S: client / server架构 MySQL DBMS(Data Bank Management System): 数据库管理系统 客户端 <---> 服 ...

  9. css hack整理:区别FF,IE8,IE7,IE6,SF,CH浏览器

    css hack整理:区别FF,IE8,IE7,IE6,SF,CH浏览器 2013年03月24日 ⁄ CSS ⁄ 共 716字 ⁄ 暂无评论         前端开发最要命的事就是处理浏览器的兼容性问 ...

  10. 建库和表的脚本.sql

    1.一直都记不太清楚,需要新建一个数据库和表的脚本是怎样的,恰巧今天翻到了,特地记录下来,希望以后用的时候记住吧! create database testdb00; use testdb00; cr ...