Place the Robots

思路:在任意一个点格子放机器人,那么它所在的行和列被控制了。我们对每一行或每一列连续的空地(草地忽视)称之为块,给每一行和每一列的块标号,

每一行的快与每一列的快相交的话,才有只有一个交点。  我们把交点当边,把行块和列块连接起来。每一个空第都是一条边。详细细节见代码。

  1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6 #include <string>
7 #include <vector>
8 #include <set>
9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF = 0x4fffffff;
17 const double EXP = 1e-5;
18 const int MS = 55;
19 const int SIZE = 100005;
20
21 // data struct
22 char pic[MS][MS];
23 int sx[MS][MS];
24 int sy[MS][MS];
25
26 int x[MS*MS];
27 int y[MS*MS];
28
29 int cx[MS*MS];
30 int cy[MS*MS];
31
32 bool edges[MS*MS][MS*MS];
33 int mark[MS*MS];
34 int nx,ny,kase;
35 int n,m;
36
37 int path(int u)
38 {
39 for(int v=1;v<=ny;v++)
40 {
41 if(edges[u][v]&&!mark[v])
42 {
43 mark[v]=1;
44 if(cy[v]==0||path(cy[v]))
45 {
46 cx[u]=v;
47 cy[v]=u;
48 return 1;
49 }
50 }
51 }
52 return 0;
53 }
54
55 void match()
56 {
57 memset(cx,0,sizeof(cx));
58 memset(cy,0,sizeof(cy));
59 int ans=0;
60 for(int u=1;u<=nx;u++)
61 {
62 if(!cx[u])
63 {
64 memset(mark,0,sizeof(mark));
65 ans+=path(u);
66 }
67 }
68 printf("Case :%d\n%d\n",kase++,ans);
69 }
70
71 int main()
72 {
73 kase=1;
74 int T;
75 scanf("%d",&T);
76 while(T--)
77 {
78 scanf("%d%d",&n,&m);
79 for(int i=0;i<n;i++)
80 scanf("%s",pic[i]);
81 memset(sx,0,sizeof(sx));
82 memset(sy,0,sizeof(sy));
83 int num=0,flag;
84 for(int i=0;i<n;i++)
85 {
86 flag=0;
87 for(int j=0;j<m;j++)
88 {
89 if(pic[i][j]=='o')
90 {
91 if(flag==0)
92 {
93 num++;
94 flag=1;
95 }
96 sx[i][j]=num;
97 }
98 else if(pic[i][j]=='#')
99 flag=0;
100 }
101 }
102 nx=num;
103 num=0;
104 for(int j=0;j<m;j++)
105 {
106 flag=0;
107 for(int i=0;i<n;i++)
108 {
109 if(pic[i][j]=='o')
110 {
111 if(flag==0)
112 {
113 num++;
114 flag=1;
115 }
116 sy[i][j]=num;
117 }
118 else if(pic[i][j]=='#')
119 flag=0;
120 }
121 }
122 ny=num;
123 memset(edges,0,sizeof(edges));
124 for(int i=0;i<n;i++)
125 for(int j=0;j<m;j++)
126 {
127 if(pic[i][j]=='o')
128 edges[sx[i][j]][sy[i][j]]=1;
129 }
130 match();
131 }
132 return 0;
133 }

Place the Robots 需要较强的建图能力的更多相关文章

  1. Codeforces 938D. Buy a Ticket (最短路+建图)

    <题目链接> 题目大意: 有n座城市,每一个城市都有一个听演唱会的价格,这n座城市由m条无向边连接,每天变都有其对应的边权.现在要求出每个城市的人,看一场演唱会的最小价值(总共花费的价值= ...

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

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

  3. [SDOI2010] 所驼门王的宝藏 [建图+tarjan缩点+DAG dp]

    题面传送门: 传送门 思路: 看完题建模,容易得出是求单向图最长路径的问题 那么把这张图缩强联通分量,再在DAG上面DP即可 然而 这道题的建图实际上才是真正的考点 如果对于每一个点都直接连边到它所有 ...

  4. Codeforces Round #545 (Div. 2) E 强连通块 + dag上求最大路径 + 将状态看成点建图

    https://codeforces.com/contest/1138/problem/E 题意 有n个城市(1e5),有m条单向边(1e5),每一周有d天(50),对于每个城市假如在某一天为1表示这 ...

  5. 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流

    1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 388  Solved: 212[Submit ...

  6. 【BZOJ-4289】Tax 最短路 + 技巧建图

    4289: PA2012 Tax Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 168  Solved: 69[Submit][Status][Dis ...

  7. CF467D Fedor and Essay 建图DFS

      Codeforces Round #267 (Div. 2) CF#267D D - Fedor and Essay D. Fedor and Essay time limit per test ...

  8. UVa 3487 & 蜜汁建图

    题意: 有两家公司都想向政府申请某些资源的使用权,并且他们都提供了一些申请列表,列表中含有申请费用和资源种类,同一家公司的申请列表之间不含有重复的资源.政府只可以完整地接受和拒绝谋一份申请列表,问政府 ...

  9. POJ 2226 最小点覆盖(经典建图)

    Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8881   Accepted: 3300 Desc ...

随机推荐

  1. Scala 中的可变(var)与不可变(val)

    引言 Scala 中定义变量分为 var(可变变量)和 val(不可变变量) Scala 中集合框架也分为可变集合和不可变集合.比如 List(列表) 和 Tuple(元组)本身就是不可变的,set ...

  2. nginx 的基础知识(二)

    Nginx 多进程网络模型 进程模型 nginx启动后以daemon的方式在后台运行,后台进程包括一个master进程和多个worker进程 master进程主要作用,接收来自外界的信号:向各work ...

  3. 痞子衡嵌入式:快速定位i.MXRT600板级设计ISP[2:0]启动模式引脚上电时序问题的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是一种快速定位i.MXRT600板级设计ISP[2-0]启动模式引脚上电时序问题的方法. 我们知道恩智浦i.MXRT600是主打音频市场的 ...

  4. 利用TortoiseGit向Github上传文件

    利用TortoiseGit向Github上传文件 第一步:建一个新文件夹,作为本地仓库 第二步:右键选择设置为版本库 若弹出,确认即可 重新打开改文件,会发现多了一个绿色的小勾 在文件夹中会自动生成一 ...

  5. Spring的三种注入

    在学习Spring的过程中,其中一个很重要的就是依赖注入DI,在此总结一下 注入方式有三种: 一.构造器注入 二.Set方式注入(重点) 三.扩展方式注入 构造器注入: a.默认使用无参构造函数创建对 ...

  6. TVM 高效保护隐私 ML

    TVM 高效保护隐私 ML 这篇文章描述了Myelin,一个在值得信赖的硬件飞地中保护隐私的机器学习框架,以及TVM如何使Myelin快速.关键的想法是,TVM,不像其它流行的ML框架,将模型编译成轻 ...

  7. MinkowskiPooling池化(下)

    MinkowskiPooling池化(下) MinkowskiPoolingTranspose class MinkowskiEngine.MinkowskiPoolingTranspose(kern ...

  8. NVIDIA深度学习Tensor Core性能解析(上)

    NVIDIA深度学习Tensor Core性能解析(上) 本篇将通过多项测试来考验Volta架构,利用各种深度学习框架来了解Tensor Core的性能. 很多时候,深度学习这样的新领域会让人难以理解 ...

  9. NVIDIA Tensor Cores解析

    NVIDIA Tensor Cores解析 高性能计算机和人工智能前所未有的加速 Tensor Cores支持混合精度计算,动态调整计算以加快吞吐量,同时保持精度.最新一代将这些加速功能扩展到各种工作 ...

  10. 中继TensorRT集成

    中继TensorRT集成 介绍 NVIDIA TensorRT是用于优化深度学习推理的库.这种集成将使尽可能多的算子从Relay转移到TensorRT,从而无需调整调度,即可在NVIDIA GPU上提 ...