题目描述 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<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)的更多相关文章

  1. codevs 1002 搭桥

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

  2. codevs 1002 搭桥x

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

  3. T1002 搭桥 codevs

    http://codevs.cn/problem/1002/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 有一矩形区域的城 ...

  4. 1、Codevs 必做:2833、1002、1003、2627、2599

    2833 奇怪的梦境  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description Aiden陷入了一个奇怪的梦境:他被困 ...

  5. 【wikioi】1002 搭桥(dfs+最小生成树)

    http://wikioi.com/problem/1002/ 今天开始又开始刷水了哈T_T.照着hzwer神犇的刷题记录刷!!! 题解: 一开始我也不会,但是我想到了直接爆搜T_T. 好吧,题解. ...

  6. Codevs 1010 过河卒== 洛谷 1002

     时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同 ...

  7. Code VS 1002 搭桥

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

  8. 【codevs】刷题记录→_→(推荐看!)

    注:本文是我原先在csdn内写的一篇博文,现转到这里,两篇博文尽量同时更新. //#include<iostream->shuati> //define 为什么刷  学长☞hzwer ...

  9. 搭桥|codevs1002|最小生成树|Prim|并查集|Elena

    1002 搭桥  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点 ...

随机推荐

  1. 【转】Java中,&&与&,||与|的区别

    转自:http://blog.csdn.net/lishiyuzuji/article/details/8116516 在Java的逻辑运算符中,有这么四类:&&(短路与),& ...

  2. sdut1650I-Keyboard(dp)

    链接 题目大意就相当于 跟你一串字符串 让你截成k段 使总体的值最小 想法是递归的 递归太慢 可以转换为递推的 这样就有可以推出状态方程 dp[i][j] = max(dp[i][j],dp[i-1] ...

  3. .NET通过字典给类赋值

    /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam& ...

  4. AJPFX关于Java Object类常用方法小总结

    java.lang.Object   java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. Object类 ...

  5. 在WIndowsPhone8 上制作的简单的计算器

    今天,闲着没事,就自己做了一个小小的计算器...虽说自己刚学wp8开发没多长时间,望大神多多指教..1.这是前台页面的代码 <Grid x:Name=" Margin="10 ...

  6. linux下安装xampp

    Choose your flavor for your linux OS, the 32-bit or 64-bit version. Change the permissions to the in ...

  7. Apache Tomcat 之路(一 基本概念)

    关于apache tomcat 基本概念(https://tomcat.apache.org/tomcat-7.0-doc/index.html) 1.tomcat 是servlet/jsp 容器,对 ...

  8. iOS Programming UIGestureRecognizer and UIMenuController

    iOS  Programming  UIGestureRecognizer and UIMenuController A UIGestureRecognizer intercepts touches ...

  9. 认识MySQL Replication

    MySQL Replication 是 MySQL 非常有特色的一个功能,他能够将一个 MySQL Server 的 Instance 中的数据完整的复制到另外一个 MySQL Server 的 In ...

  10. PHP运算符考察点

    PHP运算符优先级 运算符优先级指定了两个表达式绑定得有多"紧密".例如,表达式 1 + 5 * 3 的结果是 16 而不是 18 是因为乘号(*)的优先级比加号(+)高.必要时可 ...