搭桥(codevs 1002)
有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物。现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建,如下图城市1有5栋建筑物,可以搭建4座桥将建筑物联系起来。城市2有两座建筑物,但不能搭建桥梁将它们连接。城市3只有一座建筑物,城市4有3座建筑物,可以搭建一座桥梁联系两栋建筑物,但不能与第三座建筑物联系在一起。

在输入的数据中的第一行包含描述城市的两个整数r 和c, 分别代表从北到南、从东到西的城市大小(1 <= r <= 50 and 1 <= c <= 50). 接下来的r 行, 每一行由c 个(“#”)和(“.”)组成的字符. 每一个字符表示一个单元格。“#”表示建筑物,“.”表示空地。
在输出的数据中有两行,第一行表示建筑物的数目。第二行输出桥的数目和所有桥的总长度。
样例1
3 5
#...#
..#..
#...#
样例2
3 5
##...
.....
....#
样例3
3 5
#.###
#.#.#
###.#
样例4:
3 5
#.#..
.....
....#
样例1
5
4 4
样例2
2
0 0
样例3
1
0 0
样例4
3
1 1
见描述
分析:首先第一问很好求,深搜就可以了,然后第二问,它要求将各个建筑物连起来,并且是每两个建筑物间有一个桥,那么我们就容易想到是一棵树,而且是最小生成树,那么就预先处理一下图中节点间的路径,做克鲁斯卡尔最小生成树就可以了。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#define M 2510
using namespace std;
struct node
{
int x,y,z;
};node a[M],e[M*M/];
int fa[M],s,r,n,m;
bool vis[][];
char map[][];
int ax[]={,,,-,,,-,-};
int ay[]={,-,,,,-,,-};
int find(int x)
{
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
bool cmp(const node&s1,const node&s2)
{
return s1.z<s2.z;
}
void dfs(int x,int y)
{
vis[x][y]=true;
for(int i=;i<;i++)
{
int xx=x+ax[i],yy=y+ay[i];
if(xx>=&&xx<=r&&yy>=&&yy<=s&&map[xx][yy]=='#'&&!vis[xx][yy])
dfs(xx,yy);
}
}
void work1()
{
scanf("%d%d",&r,&s);
for(int i=;i<=r;i++)
for(int j=;j<=s;j++)
cin>>map[i][j];
int tot=;
for(int i=;i<=r;i++)
for(int j=;j<=s;j++)
if(map[i][j]=='#'&&!vis[i][j])
{
tot++;
dfs(i,j);
}
printf("%d\n",tot);
}
void work2()
{
for(int i=;i<=r;i++)
for(int j=;j<=s;j++)
{
char c=map[i][j];
if(c=='#')
{
a[++n].x=i;
a[n].y=j;
}
}
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(abs(a[i].x-a[j].x)<=)
{
e[++m].x=i;e[m].y=j;
e[m].z=abs(a[i].y-a[j].y);
if(e[m].z)e[m].z--;
}
else if(abs(a[i].y-a[j].y)<=)
{
e[++m].x=i;e[m].y=j;
e[m].z=abs(a[i].x-a[j].x)-;
}
int sum_v=,sum_n=;
sort(e+,e+m+,cmp);
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=m;i++)
{
int aa=find(e[i].x),bb=find(e[i].y);
if(aa!=bb)
{
fa[aa]=bb;
sum_v+=e[i].z;
if(e[i].z)sum_n++;
}
}
printf("%d %d",sum_n,sum_v);
}
int main()
{
work1();
work2();
return ;
}
搭桥(codevs 1002)的更多相关文章
- codevs 1002 搭桥
codevs 第一道题 先贴描述 1002 搭桥 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description ...
- codevs 1002 搭桥x
题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...
- T1002 搭桥 codevs
http://codevs.cn/problem/1002/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一矩形区域的城 ...
- 1、Codevs 必做:2833、1002、1003、2627、2599
2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困 ...
- 【wikioi】1002 搭桥(dfs+最小生成树)
http://wikioi.com/problem/1002/ 今天开始又开始刷水了哈T_T.照着hzwer神犇的刷题记录刷!!! 题解: 一开始我也不会,但是我想到了直接爆搜T_T. 好吧,题解. ...
- Codevs 1010 过河卒== 洛谷 1002
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同 ...
- Code VS 1002 搭桥
题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...
- 【codevs】刷题记录→_→(推荐看!)
注:本文是我原先在csdn内写的一篇博文,现转到这里,两篇博文尽量同时更新. //#include<iostream->shuati> //define 为什么刷 学长☞hzwer ...
- 搭桥|codevs1002|最小生成树|Prim|并查集|Elena
1002 搭桥 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点 ...
随机推荐
- 短视频SDK在广电系统的解决方案
锐动视频编辑SDK集手机视频拍摄和视频剪辑主要功能于一体,同时包含手机端视频配音配乐,字幕特效,滤镜,转场特效等各种功能,全方位满足开发者的需求,并可以快速植入到APP中. 手机端的摄像头录制和直播功 ...
- Jvisualvm--JAVA性能分析工具
JDK自带的JAVA性能分析工具.它已经在你的JDK bin目录里了,只要你使用的是JDK1.6 Update7之后的版本.点击一下jvisualvm.exe图标它就可以运行了. 这里是VisualV ...
- ubuntu18.04 python版本切换
update-alternatives是ubuntu系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令.哪个软件版本,比如,我们在系统中同时安装了python2.7和pyt ...
- Android(java)学习笔记192:ContentProvider使用之虚拟短信
1.虚拟短信应用场景: 急着脱身?应付老婆(老公.男女朋友查岗)? 使用虚拟通话短信吧.您只需通过简单设置,软件就会在指定时间会模拟一个“真实”来电或短信来迷惑对方,通过“真实”的证据让对方相 ...
- laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效
laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效 php框架 laravel 2.1k 次浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键 ...
- template or render function not defined.
template or render function not defined. H_婷 关注 2018.08.16 17:22 字数 106 阅读 3859评论 0喜欢 2 下午写 Vue $par ...
- Lodash数组方法中文总结
LodashAPI总结 Lodash是一个特别特别好用的工具,感觉有了Lodash就没有解决不了的问题了~~~~ 使用初开始 官网 https://www.lodashjs.com/docs/4.17 ...
- 下载GitHub指定目录的文件
使用网站 https://minhaskamal.github.io/DownGit/#/home
- CAD参数绘制填充(com接口)
填充是CAD图纸中不可或缺的对象,在机械设计行业,常常需要将零部件剖开,以表现其内部的细节,而这些被剖开的截面会用填充来表示:在工程设计行业,一些特殊的材料或地形,也会用填充来表示. C#中实现代码说 ...
- opencv读图片错误,已解决
could not loag image... terminate called after throwing an instance of 'cv::Exception' what(): OpenC ...