题意:在一个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. js实现页面跳转

    js方式的页面跳转1.window.location.href方式    <script language="javascript" type="text/java ...

  2. 【数位统计】之【spoj1433 KPSUM】

    [spoj1433]KPSUM 来源 高逸涵<数位计数问题解法研究> 由于自己的数位计数类的问题实在太差了,所以把例2用markdown抄写并补充了一遍. 题意 将写在纸上,然后在相邻的数 ...

  3. robotframework笔记7

    内部资源 *** Settings *** Library BuiltIn 外部资源 *** Settings *** Library com.mycompany.myproject.MyLib WI ...

  4. 补交git、ssh

    本来应该早就应该交的,自己给忘记了,非常抱歉,现在补交上来 词频统计: 代码地址:https://coding.net/u/liuff/p/cipin/git ssh:git@git.coding.n ...

  5. hdu-----(1179)Ollivanders: Makers of Fine Wands since 382 BC.(二分匹配)

    Ollivanders: Makers of Fine Wands since 382 BC. Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  6. ARM字节对齐问题详解

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...

  7. Java 集合系列 08 Map架构

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  8. Java 迭代器理解

    1.Iterator(迭代器) 作为一种设计模式,迭代器可以用于遍历一个对象,对于这个对象的底层结构不必去了解. java中的Iterator一般称为“轻量级”对象,创建它的代价是比较小的.这里笔者不 ...

  9. SQL SERVER 2008安装错误(is not a valid login or you do have permission)

    在网上搜索查找问题: 原因:[计算机名] 与[账号名称]名称一致. 解决方案: 修改计算机名 桌面 -> 我的电脑 -> 右鍵点击属性 -> 选择计算机名选项卡 -> 更改 - ...

  10. oracle知识点

    创建序列 create sequence a_seq --创建序列名字为 a_seqminvalue 1 -- 最小值为 1maxvalue 99999 --- 最大值为 99999 start wi ...