题意:在一个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. eclipse插件在线发布发布和版本更新(web site) 转

    欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...

  2. Eclipse上安装GIT插件EGit

    一.Eclipse上安装GIT插件EGit Eclipse的版本eclipse-java-helios-SR2-win32.zip(在Eclipse3.3版本找不到对应的 EGit插件,无法安装) E ...

  3. SAP 预制发票时扣除已预制的数据

    INCLUDE程序: LMR1MF6S 最后增强: ENHANCEMENT ZMIR7_01. "active version DATA:LS_YDRSEG LIKE LINE OF YDR ...

  4. c++实现之 -- 汉语词语的简单处理

    好了,我们现在已经会怎样读入了,然后就是研究一下如何存储等一些细节上的的问题了. 首先,比较函数是不能传入char*的地址的,但是可以接受一个string类. 然而,如果是两个比较长的string类, ...

  5. .NET 向SQL里写入非Text类型

    一般来说,在更新DataTable或是DataSet时,如果不采用SqlParameter,那么当输入的Sql语句出现歧义时,如字符串中含有单引号,程序就会发生错误,并且他人可以轻易地通过拼接Sql语 ...

  6. [转]iOS/iphone开发如何为苹果开发者帐号APPID续费

    原文地址:http://blog.sina.com.cn/s/blog_68661bd80101nme6.html 其实相当的简单,这篇内容是给财务看的,有的地方连我自己看了都感觉有点...但如果不详 ...

  7. 转 Warning:MongoDB Replica Sets配置注意事项

    我们知道,MongoDB不提供单机的数据安全性,取而代之的是提供了Replica Sets的高可用方案.官方文档中提到的案例是三个节点组成的Replica Sets,这样在其中任何一个节点宕机后都会自 ...

  8. JBOss启动只能在本机访问的解决办法

    环境CentOS6.4_X64 JBoss:5.1.2 eap 启动:JBOSS_HOME/bin/run.sh 在本机可以通过http://localhost:8080访问,而其他机器无论是通过机器 ...

  9. 如何在Quagga BGP路由器中设置IPv6的BGP对等体和过滤

    在本教程中,我们会向你演示如何创建IPv6 BGP对等体并通过BGP通告IPv6前缀.同时我们也将演示如何使用前缀列表和路由映射特性来过滤通告的或者获取到的IPv6前缀. 拓扑 服务供应商A和B希望在 ...

  10. bzoj 2730: [HNOI2012]矿场搭建

    #include<cstdio> #include<cstring> #include<iostream> #define M 508 using namespac ...