搭桥(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 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点 ...
随机推荐
- Python variable 作用域和初始化
Python 根据LEGB rule在不同的namespace中找变量 在def的函数中对global 变量做修改还是不推荐的,应该将其作为参数传入函数 try: do_something() cnt ...
- Palindromic Subsets 数学 + 线段树
https://www.hackerrank.com/contests/101hack44/challenges/palindromic-subsets 如果有3个a.2个b.1个c. 每个a看成不同 ...
- [书目20141009]《ReWork》
ReWork1: ============= 引言篇INTRODUCTION开局篇FIRST 新的现实缷负篇TAKEDOWNS 忘了“现实世界” 哪来的从错误中学习 计划即瞎猜 何必壮大? 工作狂 受 ...
- SpringMVC的简单传值
之前学习SpringMVC时感觉他的传值很神奇:简便,快捷,高效. 今天写几个简单的传值与大家分享,希望能对大家有帮助. 一. 从后往前传: (1) @Controller @RequestMappi ...
- 一致性hash学习
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...
- Windows下使用JMeter
简介 Apache JMeter是100%纯java桌面应用程序,被设计用来测试C/S结构的软件(例如web应用程序).它可以被用来测试包括基于静态和动态资源程序的性能,例如静态文件,Java Ser ...
- swift class type isa-swizzling
class 是引用类型,生成的实例分布在 Heap(堆) 内存区域上,在 Stack(栈)只存放着一个指向堆中实例的指针.因为考虑到引用类型的动态性和 ARC 的原因,class 类型实例需要有一块单 ...
- COMMIT - 提交当前事务
SYNOPSIS COMMIT [ WORK | TRANSACTION ] DESCRIPTION 描述 COMMIT 提交当前事务. 所有事务的更改都将为其他事务可见,而且保证当崩溃发生时的可持续 ...
- C#反射的使用
1.先定义个类,编译成dll,用于调用 nameSpace Test{ public class Class1 { private string _name; private int _age; pu ...
- CAS机制总结
一.简介 CAS机制:(Compare and set)比较和替换 简单来说–>使用一个期望值来和当前变量的值进行比较,如果当前的变量值与我们期望的值相等,就用一个新的值来更新当前变量的值CAS ...