【BFS】【map】hdu5925 Coconuts
题意:一张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的更多相关文章
- 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 ...
- POJ 3414 Pots【bfs模拟倒水问题】
链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...
- 【日常学习】【并查集+map】codevs2639 约会计划题解
然而我居然让诸城一中悲剧机房的C++可以编译了··· 直接上题目 题目描写叙述 Description cc是个超级帅哥,口才又好.rp极高(这句话似乎降rp),又非常的幽默,所以非常多mm都跟他关系 ...
- hdoj 1495 非常可乐【bfs隐式图】
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 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 ...
- 【POI xls Java map】使用POI处理xls 抽取出异常信息 --java1.8Group by ---map迭代 -- 设置单元格高度
代码处理逻辑: 代码流程: 1.首先需要创建一个实体 用来存储 相关信息 package com.sxd.test.unusualName; public class NameEntity { pri ...
- 【BFS宽度优先搜索】
一.求所有顶点到s顶点的最小步数 //BFS宽度优先搜索 #include<iostream> using namespace std; #include<queue> # ...
- HDU_1430 魔板 【BFS+康托展开+置换】
一.题面 POJ1430 二.分析 该题与之前做的八数码不同,它是一个2*4的棋盘,并且没有空的区域.这样考虑的情况是很少的,依然结合康托展开,这时康托展开最多也只乘7的阶乘,完全可以BFS先预处理一 ...
- POJ_3126 Prime Path 【BFS+素数打表】
一.题目 http://poj.org/problem?id=3126 二.分析 该题主要是要让我们找到一个$4$位素数到另一个$4$位素数的最少的变换次数,且要求保证每一次变换都满足 1.下一个数必 ...
- 【bfs分层图 dp】hihocoder#1147 : 时空阵
最短路径树上分层dp的一类套路吧 题目大意 幽香这几天学习了魔法,准备建造一个大型的时空传送阵. 幽香现在可以在幻想乡的n个地点建造一些传送门,如果她建造了从地点a与地点b之间的传送门,那么从a到b和 ...
随机推荐
- 【洛谷 P3705】 [SDOI2017]新生舞会(费用流,01分数规划)
题目链接 看到这题我想到了以前做过的一题,名字记不清了,反正里面有"矩阵"二字,然后是道二分图匹配的题. 经典的行列连边网络流. 第\(i\)行和第\(j\)列连边,费用为\(b[ ...
- 【leetcode 简单】第三十三题 验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, a c ...
- xargs -i 和-I 的区别【转】
xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如 # find . -type f -name "*.log" | xargs rm -rf * ...
- Ubuntu vi 上下左右变ABCD问题解决方法
---恢复内容开始--- 错误问题:vi上下左右键显示为ABCD的问题 解决方法: 只要依次执行以下两个命令即可完美解决Ubuntu下vi编辑器方向键变字母的问题. 一.执行命令 sudo apt-g ...
- mysql触发器(Trigger)简明总结和使用实例
一,什么触发器 1,个人理解触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了.你放炮仗,点燃了,一会就炸了.2,官方定义触发器(tr ...
- docvalue and fielddata
大部分字段类型默认被索引的(inverted index),可以被搜索search: 哪个文档有这个词sort&aggregations: look up the document and f ...
- ajax刷新输出实时数据
setInterval('shuaxin()',3000); function shuaxin(){ $.ajax({//股票 url:"http://apimarkets.wallstre ...
- DB2:FETCH FIRST 1 ROWS ONLY
DB2:FETCH FIRST ROWS ONLY,在Oracle中使用where rownum=1代替 DB2: SELECT INSTORAGENO FROM ( SELECT max(AUDIT ...
- 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 ...
- hdu 1849(巴什博弈)
Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...