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

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

用map打标记进行判重。

#include<cstdio>
#include<queue>
#include<set>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> Point;
const int dx[]={0,-1,0,1,1,-1,1,-1},dy[]={-1,0,1,0,-1,-1,1,1};
const int dx1[]={0,-1,0,1},dy1[]={-1,0,1,0};
Point p[205];
int T,m,n,K;
int main(){
scanf("%d",&T);
for(int zu=1;zu<=T;++zu){
map<Point,int>vis;
set<Point>za;
vector<ll>vs;
printf("Case #%d:\n",zu);
scanf("%d%d%d",&n,&m,&K);
for(int i=1;i<=K;++i){
scanf("%d%d",&p[i].first,&p[i].second);
za.insert(p[i]);
}
int bj=0;
for(int i=1;i<=K;++i){
int x=p[i].first,y=p[i].second;
for(int j=0;j<8;++j){
int tx=x+dx[j],ty=y+dy[j];
if(tx>=1 && tx<=n && ty>=1 && ty<=m){
if(za.find(Point(tx,ty))==za.end()){
if(!vis[Point(tx,ty)]){
++bj;
queue<Point>q;
q.push(Point(tx,ty));
vis[Point(tx,ty)]=bj;
int cnt=1;
bool flag=1;
while(!q.empty()){
Point U=q.front();
q.pop();
for(int k=0;k<4;++k){
int ttx=U.first+dx1[k],tty=U.second+dy1[k];
if(ttx>=1 && ttx<=n && tty>=1 && tty<=m && za.find(Point(ttx,tty))==za.end()){
int tmp=vis[Point(ttx,tty)];
if(tmp>0 && tmp<bj){
flag=0;
break;
}
else if(tmp==0){
q.push(Point(ttx,tty));
++cnt;
vis[Point(ttx,tty)]=bj;
if(cnt>40000){
flag=0;
goto OUT;
}
}
}
}
}
OUT:
if(flag){
vs.push_back((ll)cnt);
}
}
}
}
}
}
ll sum=0;
for(vector<ll>::iterator it=vs.begin();it!=vs.end();++it){
sum+=(*it);
}
if((ll)n*(ll)m>sum+(ll)K){
vs.push_back((ll)n*(ll)m-sum-(ll)K);
}
sort(vs.begin(),vs.end());
int sz=vs.size();
printf("%d\n",sz);
for(int i=0;i<sz;++i){
printf("%lld",vs[i]);
if(i==sz-1){
puts("");
}
else{
putchar(' ');
}
}
}
return 0;
}

【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. scandir函数的研究【笔记】

    以下是本人的学习笔记,代码并非原创,均摘自官方源码,贴出来仅供学习记录用 scandir 的使用要注意内存泄漏的问题 scandir函数实现: vi ./uClibc-0.9.33.2/libc/mi ...

  2. 在新版linux上编译老版本的kernel出现kernel/timeconst.h] Error 255

    在使用ubuntu16.4编译Linux-2.6.31内核时出现这样的错误 可以修改timeconst.pl的内容后正常编译. 以下是编译错误提示的内容: Can't use 'defined(@ar ...

  3. python selenium登陆网易云音乐

    from selenium import webdriver import time driver=webdriver.Chrome() driver.get("http://music.1 ...

  4. requests 介绍

    一.  requests 参数 - method: 提交方式 - url: 提交地址 - params: 在URL中传递的参数,GET - data: 在请求体里传递的数据 - json 在请求体里传 ...

  5. ***PHP5.6.x SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 解决方案

    centos: 在php.ini中增加一行 1 openssl.cafile=/etc/pki/tls/certs/ca-bundle.crt 重启服务器使修改生效

  6. cocos2dx 开发配置的一些环境变量(mac/linux)

    通常开发需要配置一些环境变量,下面把我电脑的部分配置分析一下. 1.android开发配置,ndk,sdk,ant 2.cocos2dx开发配置,cocos2d-x export COCOS2DX_R ...

  7. ssh客户端乱码

    export LC_ALL=zh_CN.GB2312;export LANG=zh_CN.GB2312

  8. GUC-4 CopyOnWriteArrayList/CopyOnWriteArraySet

    /* * CopyOnWriteArrayList/CopyOnWriteArraySet : “写入并复制” * 注意:添加操作多时,效率低,因为每次添加时都会进行复制,开销非常的大.并发迭代操作多 ...

  9. Robot Framework Selenium(RFS :web自动化测试神器)

    Robot Framework 目录 1简介 2特性 3RIDE 1.简介: Robot Framework是一款python编写的功能自动化测试框架.具备良好的可扩展性,支持关键字驱动,可以同时测试 ...

  10. ubuntu16.04 内核源码编译

    1)下载 首先看一下自己的内核版本 apt-cache search linux-source下载内核代码:sudo apt-get install linux-source-4.10.0 2)解压: ...