ZOJ 1654 Place the Robots

题目大意:

在空地上放置尽可能多机器人,机器人朝上下左右4个方向发射子弹,子弹能穿过草地,但不能穿过墙,

两个机器人之间的子弹要保证互不干扰,求所能放置的机器人的最大个数

每个机器人所在的位置确定了,那么对应的横向和竖向子弹能到达的空地就全部被覆盖了

我们将横向所能连接在一块的空地区域标上同一个标号

比如o*o#o , 就可标号为10102因为1,3空地中间的草地不影响子弹的穿越

同理,我们将竖向的所能连接在一块的空地区域标上同一个标号

那么就可以建立一个横向到达竖向的二部图匹配

每次成功匹配一对,就相当于在这横竖交叉处放了一个炮台

这就转化成了最大匹配数

 1 #include <cstdio>
 2 #include <cstring>
 3
 4 using namespace std;
 5 const int N = 55;
 6
 7 char str[N][N];
 8 int n , m , xs[N][N] , ys[N][N] , idx , idy;//idx记录以行为轴的最大标号,idy则表示以列为轴的最大标号
 9 int cx[N*N] , cy[N*N] , visy[N*N];
10 bool g[N*N][N*N];//int是4个字节,用int会MLE,bool一个字节
11
12 int dfs(int u)
13 {
14     for(int v = 1 ; v<=idy ; v++){
15         if(g[u][v] && !visy[v]){
16             visy[v] = 1;
17             if(cy[v] == -1 || dfs(cy[v])){
18                 cx[u] = v;
19                 cy[v] = u;
20                 return 1;
21             }
22         }
23     }
24     return 0;
25 }
26
27 int MaxMatch()
28 {
29     memset(cx , -1 , sizeof(cx));
30     memset(cy , -1 , sizeof(cy));
31     int ans = 0;
32     for(int i=1 ; i<=idx ; i++){
33         if(cx[i] == -1){
34             memset(visy , 0 , sizeof(visy));
35             ans += dfs(i);
36         }
37     }
38     return ans;
39 }
40
41 int main()
42 {
43   //  freopen("a.in" , "r" , stdin);
44     int T , cas = 0;
45     scanf("%d" , &T);
46     while(T--)
47     {
48         scanf("%d%d" , &n , &m);
49         for(int i = 0 ; i<n ; i++)
50             scanf("%s" , str[i]);
51
52         //给每行炮台所能触及的位置编为相同号
53         int id = 1 , flag = 0;
54         for(int i=0 ; i<n ; i++){
55             if(flag) flag = 0 , id++;
56             for(int j = 0 ; j < m ; j++){
57                 if(str[i][j] == ‘o‘)
58                     xs[i][j] = id , idx = id , flag = 1;
59                 else if(str[i][j] == ‘#‘)
60                     flag = 0 , id++;
61             }
62         }
63
64         //给每列炮台所能触及的位置编为相同号
65         id = 1 , flag = 0;
66         for(int i=0 ; i<m ; i++){
67             if(flag) flag = 0 , id++;
68             for(int j = 0 ; j < n ; j++){
69                 if(str[j][i] == ‘o‘)
70                     ys[j][i] = id , idy = id , flag = 1;
71                 else if(str[j][i] == ‘#‘)
72                     flag = 0 , id++;
73             }
74         }
75
76         //构造二部图
77         memset(g , 0 , sizeof(g));
78         for(int i = 0 ; i<n ; i++)
79             for(int j = 0 ; j<m ; j++){
80                 if(str[i][j] == ‘o‘)
81                     g[xs[i][j]][ys[i][j]] = true;
82             }
83         printf("Case :%d\n%d\n" , ++cas , MaxMatch());
84     }
85     return 0;
86 }
时间: 2024-08-09 16:02:56

ZOJ 1654 Place the Robots的相关文章

ZOJ 1654 - Place the Robots (二分图最大匹配)

题意:在一个m*n的地图上,有空地,草和墙,其中空地和草能穿透攻击光线,而墙不能.每个机器人能够上下左右攻击,问在地图上最多能放多少个不互相攻击的机器人. 这个题和HDU 1045 -  Fire Net很像.很容易联想到对每个点编号然后互相攻击的点连边再求图的最大独立集,但是这个题数据量太多,超时. 换个思路. 将每个机器人可以攻击到的区域在横和竖方向上分开,这样当横和竖攻击方向都确定时就可以确定一个机器人的放置位置,而在同一个横或竖的攻击区域内不可以再放置机器人. 这样我们把原图上的空地按照

ZOJ 1654 Place the Robots 二分图最大匹配

唉,又是神一样的建模,表示完全想不到. 题意是给你一块地,上面有空地,草地,障碍三种地形,然后让你在上面放机器人,机器人只能放在空地上.机器人会向上下左右四个方向发出攻击,机器人的攻击可以穿过草地但是无法穿过障碍.问你在不会是机器人相互攻击的前提下,最多能放多少个机器人. 我觉得大致的思路应该是这样的,首先会想当然的想到把能够相互攻击到的空地连边,然后求最大独立集,但最大独立集不好求,所以要想办法把它转化成最大匹配问题. 所以要想办法把空地变成边,首先一块空地肯定是有他的横坐标和纵坐标,可以表示

ZOJ 1654 Place the Robots (二分匹配 )

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 Robert is a famous engineer. One day he was given a task by his boss. The background of the task was the following: Given a map consisting of square blocks. There were three kinds of

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

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 AC一百道水题,不如AC一道难题来的舒服. 题意:一个n*m地图.*代表草地,#代表墙,o代表空地,要再图中的o处放机器人,机器人能够攻击(上下左右)4个方向,攻击范围无限长,并且机器人不能相互攻击,草地不能放置机器人,且机器人的攻击能够穿过草地,可是机器人的攻击不能穿过墙,比方 "   *o#o  "这一行就能够放两个机器人," o*oo

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 the following: Given a map consisting of square blocks. There were three kinds of blocks: Wall, Grass, and Empty. His boss wanted to place as many ro

ACM -二分图题目小结(更新中)

暂时只包括与最大匹配相关的问题. 求最大独立集,最小路径覆盖等等大多数题目都可以转化为求最大匹配用匈牙利算法解决. 1.最大匹配(边集) 此类问题最直接,直接用匈牙利算法即可. HDU 2063  过山车 http://acm.hdu.edu.cn/showproblem.php?pid=2063 二分图最大匹配模版题. ZOJ 1654 - Place the Robots http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode

二分图学习

图论中的难见就是建图然后套用算法. 特点: 仅仅能一一相应,即XX仅仅能有一个人. 先来一个比較好的入门资料二分图最大匹配 參考 二分图建图方法 算法的思路是不停的找增广路径, 并添加匹配的个数,增广路径顾名思义是指一条能够使匹配数变多的路径,在匹配问题中,增广路径的表现形式是一条"交错路径",也就是说这条由图的边组成的路径. 它的第一条边是眼下还没有參与匹配的,第二条边參与了匹配.第三条边没有..最后一条边没有參与匹配,而且始点和终点还没有被选择过.这样交错进行,显然他有奇数条边.

POJ 3020 Antenna Placement(二分图建图训练 + 最小路径覆盖)

题目链接:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6692   Accepted: 3325 Description The Global Aerial Research Centre has been allotted the task of building the fifth generation of mobi

ZOJ 1654--Place the Robots【二分匹配 &amp;amp;&amp;amp; 经典建图】

Place the Robots Time Limit: 5 Seconds      Memory Limit: 32768 KB Robert is a famous engineer. One day he was given a task by his boss. The background of the task was the following: Given a map consisting of square blocks. There were three kinds of