题意:一张n*m的网格图(n和m可以达到10^9),其中K个点是障碍物(不超过200个),问你没有被障碍物占据的点形成了几个连通块?并且输出各个连通块的大小。

容易证明,大小超过40000的连通块最多只有一个。于是可以从每个与障碍物邻接的非障碍点出发bfs,限制步数不超过40000,这样就可以找到所有小的连通块。最后如果n*m-K-小的连通块的总大小不等于0,则剩下的就是那个大的连通块的大小。

用map打标记进行判重。

  1. #include<cstdio>
  2. #include<queue>
  3. #include<set>
  4. #include<vector>
  5. #include<map>
  6. #include<algorithm>
  7. using namespace std;
  8. typedef long long ll;
  9. typedef pair<int,int> Point;
  10. const int dx[]={0,-1,0,1,1,-1,1,-1},dy[]={-1,0,1,0,-1,-1,1,1};
  11. const int dx1[]={0,-1,0,1},dy1[]={-1,0,1,0};
  12. Point p[205];
  13. int T,m,n,K;
  14. int main(){
  15. scanf("%d",&T);
  16. for(int zu=1;zu<=T;++zu){
  17. map<Point,int>vis;
  18. set<Point>za;
  19. vector<ll>vs;
  20. printf("Case #%d:\n",zu);
  21. scanf("%d%d%d",&n,&m,&K);
  22. for(int i=1;i<=K;++i){
  23. scanf("%d%d",&p[i].first,&p[i].second);
  24. za.insert(p[i]);
  25. }
  26. int bj=0;
  27. for(int i=1;i<=K;++i){
  28. int x=p[i].first,y=p[i].second;
  29. for(int j=0;j<8;++j){
  30. int tx=x+dx[j],ty=y+dy[j];
  31. if(tx>=1 && tx<=n && ty>=1 && ty<=m){
  32. if(za.find(Point(tx,ty))==za.end()){
  33. if(!vis[Point(tx,ty)]){
  34. ++bj;
  35. queue<Point>q;
  36. q.push(Point(tx,ty));
  37. vis[Point(tx,ty)]=bj;
  38. int cnt=1;
  39. bool flag=1;
  40. while(!q.empty()){
  41. Point U=q.front();
  42. q.pop();
  43. for(int k=0;k<4;++k){
  44. int ttx=U.first+dx1[k],tty=U.second+dy1[k];
  45. if(ttx>=1 && ttx<=n && tty>=1 && tty<=m && za.find(Point(ttx,tty))==za.end()){
  46. int tmp=vis[Point(ttx,tty)];
  47. if(tmp>0 && tmp<bj){
  48. flag=0;
  49. break;
  50. }
  51. else if(tmp==0){
  52. q.push(Point(ttx,tty));
  53. ++cnt;
  54. vis[Point(ttx,tty)]=bj;
  55. if(cnt>40000){
  56. flag=0;
  57. goto OUT;
  58. }
  59. }
  60. }
  61. }
  62. }
  63. OUT:
  64. if(flag){
  65. vs.push_back((ll)cnt);
  66. }
  67. }
  68. }
  69. }
  70. }
  71. }
  72. ll sum=0;
  73. for(vector<ll>::iterator it=vs.begin();it!=vs.end();++it){
  74. sum+=(*it);
  75. }
  76. if((ll)n*(ll)m>sum+(ll)K){
  77. vs.push_back((ll)n*(ll)m-sum-(ll)K);
  78. }
  79. sort(vs.begin(),vs.end());
  80. int sz=vs.size();
  81. printf("%d\n",sz);
  82. for(int i=0;i<sz;++i){
  83. printf("%lld",vs[i]);
  84. if(i==sz-1){
  85. puts("");
  86. }
  87. else{
  88. putchar(' ');
  89. }
  90. }
  91. }
  92. return 0;
  93. }

【BFS】【map】hdu5925 Coconuts的更多相关文章

  1. HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  2. POJ 3414 Pots【bfs模拟倒水问题】

    链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...

  3. 【日常学习】【并查集+map】codevs2639 约会计划题解

    然而我居然让诸城一中悲剧机房的C++可以编译了··· 直接上题目 题目描写叙述 Description cc是个超级帅哥,口才又好.rp极高(这句话似乎降rp),又非常的幽默,所以非常多mm都跟他关系 ...

  4. hdoj 1495 非常可乐【bfs隐式图】

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. HDU 4474 Yet Another Multiple Problem【2012成都regional K题】 【BFS+一个判断技巧】

    Yet Another Multiple Problem Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 65536/65536 K ...

  6. 【POI xls Java map】使用POI处理xls 抽取出异常信息 --java1.8Group by ---map迭代 -- 设置单元格高度

    代码处理逻辑: 代码流程: 1.首先需要创建一个实体 用来存储 相关信息 package com.sxd.test.unusualName; public class NameEntity { pri ...

  7. 【BFS宽度优先搜索】

    一.求所有顶点到s顶点的最小步数   //BFS宽度优先搜索 #include<iostream> using namespace std; #include<queue> # ...

  8. HDU_1430 魔板 【BFS+康托展开+置换】

    一.题面 POJ1430 二.分析 该题与之前做的八数码不同,它是一个2*4的棋盘,并且没有空的区域.这样考虑的情况是很少的,依然结合康托展开,这时康托展开最多也只乘7的阶乘,完全可以BFS先预处理一 ...

  9. POJ_3126 Prime Path 【BFS+素数打表】

    一.题目 http://poj.org/problem?id=3126 二.分析 该题主要是要让我们找到一个$4$位素数到另一个$4$位素数的最少的变换次数,且要求保证每一次变换都满足 1.下一个数必 ...

  10. 【bfs分层图 dp】hihocoder#1147 : 时空阵

    最短路径树上分层dp的一类套路吧 题目大意 幽香这几天学习了魔法,准备建造一个大型的时空传送阵. 幽香现在可以在幻想乡的n个地点建造一些传送门,如果她建造了从地点a与地点b之间的传送门,那么从a到b和 ...

随机推荐

  1. 【洛谷 P3705】 [SDOI2017]新生舞会(费用流,01分数规划)

    题目链接 看到这题我想到了以前做过的一题,名字记不清了,反正里面有"矩阵"二字,然后是道二分图匹配的题. 经典的行列连边网络流. 第\(i\)行和第\(j\)列连边,费用为\(b[ ...

  2. 【leetcode 简单】第三十三题 验证回文串

    给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, a c ...

  3. xargs -i 和-I 的区别【转】

    xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如  # find . -type f -name "*.log" | xargs rm -rf * ...

  4. Ubuntu vi 上下左右变ABCD问题解决方法

    ---恢复内容开始--- 错误问题:vi上下左右键显示为ABCD的问题 解决方法: 只要依次执行以下两个命令即可完美解决Ubuntu下vi编辑器方向键变字母的问题. 一.执行命令 sudo apt-g ...

  5. mysql触发器(Trigger)简明总结和使用实例

    一,什么触发器 1,个人理解触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了.你放炮仗,点燃了,一会就炸了.2,官方定义触发器(tr ...

  6. docvalue and fielddata

    大部分字段类型默认被索引的(inverted index),可以被搜索search: 哪个文档有这个词sort&aggregations: look up the document and f ...

  7. ajax刷新输出实时数据

    setInterval('shuaxin()',3000); function shuaxin(){ $.ajax({//股票 url:"http://apimarkets.wallstre ...

  8. DB2:FETCH FIRST 1 ROWS ONLY

    DB2:FETCH FIRST ROWS ONLY,在Oracle中使用where rownum=1代替 DB2: SELECT INSTORAGENO FROM ( SELECT max(AUDIT ...

  9. ISSCC 2017论文导读 Session 14 Deep Learning Processors,A 2.9TOPS/W Deep Convolutional Neural Network

    最近ISSCC2017大会刚刚举行,看了关于Deep Learning处理器的Session 14,有一些不错的东西,在这里记录一下. A 2.9TOPS/W Deep Convolutional N ...

  10. hdu 1849(巴什博弈)

    Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...