时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
题目描述 Description

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

输入描述 Input Description

在输入的数据中的第一行包含描述城市的两个整数r 和c, 分别代表从北到南、从东到西的城市大小(1 <= <= 50 and 1 <=  c <= 50). 接下来的r 行, 每一行由个(“#”)和(“.”)组成的字符. 每一个字符表示一个单元格。“#”表示建筑物,“.”表示空地。

输出描述 Output Description

在输出的数据中有两行,第一行表示建筑物的数目。第二行输出桥的数目和所有桥的总长度。

样例输入 Sample Input

样例1

3 5

#...#

..#..

#...#

样例2

3 5

##...

.....

....#

样例3

3 5

#.###

#.#.#

###.#

样例4:

3 5

#.#..

.....

....#

样例输出 Sample Output

样例1

5

4 4

样例2

2

0 0

样例3

1

0 0

样例4

3

1 1

数据范围及提示 Data Size & Hint

见描述

 #include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath> #define N 10015 using namespace std; int r,c,num,cnt;
int bridge,tot,building;
int fa[N*];
char s; struct node_map
{
int x,y;
}map[N*]; struct node_edge
{
int from,to,dis;
}edge[N*]; void init()
{
for(int i=;i<=r*c;i++)
fa[i]=i;
} int find(int x)
{
if(fa[x]!=x)
return fa[x]=find(fa[x]);
return fa[x];
} void add(int from,int to,int dis)
{
cnt++;
edge[cnt].from=from;
edge[cnt].to=to;
edge[cnt].dis=dis;
} void work(int a,int b)
{
int dis_x=abs(map[a].x-map[b].x);
int dis_y=abs(map[a].y-map[b].y);
if(dis_x>=&&dis_y>=) return ;
if((dis_x<=&&dis_y<=))
if(find(a)==find(b)) return ;
else
fa[find(a)]=find(b);
if(dis_x>=) add(a,b,dis_x-);
else add(a,b,dis_y-);
} bool cmp(node_edge a,node_edge b)
{
return a.dis<b.dis;
} void kruskal()
{
sort(edge+,edge+cnt+,cmp);
for(int i=;i<=cnt;i++)
{
int fa_x=find(edge[i].from),fa_y=find(edge[i].to);
if(fa_x!=fa_y)
{
bridge++;
fa[fa_x]=fa_y;
tot+=edge[i].dis;
}
}
} int main()
{
scanf("%d%d",&r,&c);
init();
for(int i=;i<=r;i++)
for(int j=;j<=c;j++)
{
cin>>s;
if(s=='#')
{
num++;
map[num].x=i;
map[num].y=j;
for(int k=;k<num;k++) work(k,num);
}
}
for(int i=;i<=num;i++)
if(i==fa[i]) building++;
kruskal();
printf("%d\n%d %d",building,bridge,tot);
return ;
}

T1002 搭桥 codevs的更多相关文章

  1. codevs 1002 搭桥

    codevs 第一道题 先贴描述 1002 搭桥  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description ...

  2. 搭桥(codevs 1002)

    题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...

  3. codevs 1002 搭桥x

    题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...

  4. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  5. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  6. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  7. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  8. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  9. codevs 1228 苹果树 树链剖分讲解

    题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...

随机推荐

  1. Windows8.1进入IIS管理器的方法

    以前在本机的Windows8.1操作系统中安装了IIS,很久没有使用过,今天在安装IBM Http Server的时候启动失败,才想起来IIS占用了80端口,需要把IIS服务停止掉.找了半天才找到进入 ...

  2. 石墨烯(转自wiki)

    石墨烯(Graphene)是一种由碳原子以sp2杂化轨道组成六角型呈蜂巢晶格的平面薄膜,只有一个碳原子厚度的二维材料[1].石墨烯一直被认为是假设性的结构,无法单独稳定存在[1],直至2004年,英国 ...

  3. android中实现在矩形框中输入文字,可以显示剩余字数的功能

    虽然这两个功能都比较简单,但是在实际app开发中真的很常见,特别是显示字数或剩余字数这个功能 如下图: 要实现上面的功能,需要做到三点: 1.实现矩形框布局 思路就是矩形框作为整个布局的一个backg ...

  4. 【Python-2.7】换行符和制表符

    在Python中换行符“\n”表示接下来的内容将会换到下一行显示,制表符“\t”表示下面的内容显示时在前面留出空白,如打印如下内容: Dear: I love you forever! 上面的一段话分 ...

  5. 扩增子分析解读2提取barcode 质控及样品拆分 切除扩增引物

    本节课程,需要完成扩增子分析解读1质控 实验设计 双端序列合并 先看一下扩增子分析的整体流程,从下向上逐层分析 分析前准备 # 进入工作目录 cd example_PE250 上一节回顾:我们拿到了双 ...

  6. Java基础(四)--接口和抽象类

    接口和抽象类能够体现OOP的抽象,而接口和抽象类也是日常开发中经常用到的 抽象方法: 抽象方法就是被abstract修饰的方法,只有声明,没有实现,也就是没有方法体 public abstract v ...

  7. ThinkPHP---TP功能类之公文管理功能

    [一]准备工作 (1)创建数据表 表名:sp_doc create table sp_doc( id int(11) not null auto_increment, title varchar(50 ...

  8. 00Extensible Markup Language

    Extensible Markup Language XML(Extensible Markup Language)可扩展标记语言是用来网络数据的组织结构,传输及存储.

  9. 数字图像处理技术在TWaver可视化中的应用

    数字图像处理(Digital Image Processing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程.常用的图像处理方法有图像增强.复原.编码.压缩等,数 ...

  10. libevent reference Mannual IV --Helper functions and types

    FYI: http://www.wangafu.net/~nickm/libevent-book/Ref5_evutil.html Helper functions and types for Lib ...