Place the Robots

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

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

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

    Linux是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的性能稳定的操作系统,可免费使用并自由传播. Linux是众多操作系统之一 , 目前流行的服务器和 PC 端操作系统有 L ...

  2. k8s 管理存储资源(10)

    一.Kubernetes 如何管理存储资源 理解Volume 我们经常会说:容器和 Pod 是短暂的. 其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据 ...

  3. k8s集群部署(2)

    一.利用ansible部署kubernetes准备阶段 1.集群介绍 基于二进制方式部署k8s集群和利用ansible-playbook实现自动化:二进制方式部署有助于理解系统各组件的交互原理和熟悉组 ...

  4. 大数据 什么是 ETL

    ETL 概念 ETL 这个术语来源于数据仓库,ETL 指的是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程.ETL 的目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提 ...

  5. 11.14 mii-tool:管理网络接口的状态

    mii-tool命令用于查看.管理网络接口,默认情况下网卡的状态是自动协商的,但是有时也会出现不正常的情况,可以使用mii-tool进行调整. mii-tool [option] [interface ...

  6. python3 smtplib发送邮件

    使用smtp包发送邮件还依赖email的一些方法 发送邮件主要分为三步: 1,定义邮箱参数:邮箱服务器地址,邮箱用户名,邮箱密码,邮件发送方,邮件接收方,邮件标题,邮件内容 2,配置发送内容 3,实例 ...

  7. Centos7.3 进入救援模式,解决虚拟机开机引导只能看到一个横杠

    问题描述:搭建在CAS服务器中的虚拟机开机后只能看到一个横杠,因为开发同事的一些操作使glibc库/lib64/libc.so.6软链接失效 1.libc.so.6 是c运行时库 glibc的软链接, ...

  8. 使用Python检测局域网内IP地址使用情况

    来源:https://www.cnblogs.com/donlin-zhang/p/6812675.html 在测试环境搭建的过程中,经常需要给服务器分配静态IP地址,由于不清楚当前局域网内部哪些IP ...

  9. Python判断身份证是否合法

    利用正则表达式实现对身份证合法程度的判断 1 # !usr/bin/env python3 2 # coding:utf-8 3 """ 4 @ Copyright (c ...

  10. 学习Python中出现的错误集合(不定时更新)jupyter平台

    出现的问题:1. 本图的错误,一个是line 7 init的两侧应该是是双下划线"__"导致所示错误 2. 本图的错误是 line 12 Student.student_tatal ...