题目描述 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

见描述

  1. 分析:首先第一问很好求,深搜就可以了,然后第二问,它要求将各个建筑物连起来,并且是每两个建筑物间有一个桥,那么我们就容易想到是一棵树,而且是最小生成树,那么就预先处理一下图中节点间的路径,做克鲁斯卡尔最小生成树就可以了。
  2. 代码:
  3. #include<cstdio>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<cstdlib>
  7. #define M 2510
  8. using namespace std;
  9. struct node
  10. {
  11. int x,y,z;
  12. };node a[M],e[M*M/];
  13. int fa[M],s,r,n,m;
  14. bool vis[][];
  15. char map[][];
  16. int ax[]={,,,-,,,-,-};
  17. int ay[]={,-,,,,-,,-};
  18. int find(int x)
  19. {
  20. if(fa[x]==x)return x;
  21. return fa[x]=find(fa[x]);
  22. }
  23. bool cmp(const node&s1,const node&s2)
  24. {
  25. return s1.z<s2.z;
  26. }
  27. void dfs(int x,int y)
  28. {
  29. vis[x][y]=true;
  30. for(int i=;i<;i++)
  31. {
  32. int xx=x+ax[i],yy=y+ay[i];
  33. if(xx>=&&xx<=r&&yy>=&&yy<=s&&map[xx][yy]=='#'&&!vis[xx][yy])
  34. dfs(xx,yy);
  35. }
  36. }
  37. void work1()
  38. {
  39. scanf("%d%d",&r,&s);
  40. for(int i=;i<=r;i++)
  41. for(int j=;j<=s;j++)
  42. cin>>map[i][j];
  43. int tot=;
  44. for(int i=;i<=r;i++)
  45. for(int j=;j<=s;j++)
  46. if(map[i][j]=='#'&&!vis[i][j])
  47. {
  48. tot++;
  49. dfs(i,j);
  50. }
  51. printf("%d\n",tot);
  52. }
  53. void work2()
  54. {
  55. for(int i=;i<=r;i++)
  56. for(int j=;j<=s;j++)
  57. {
  58. char c=map[i][j];
  59. if(c=='#')
  60. {
  61. a[++n].x=i;
  62. a[n].y=j;
  63. }
  64. }
  65. for(int i=;i<=n;i++)
  66. for(int j=i+;j<=n;j++)
  67. if(abs(a[i].x-a[j].x)<=)
  68. {
  69. e[++m].x=i;e[m].y=j;
  70. e[m].z=abs(a[i].y-a[j].y);
  71. if(e[m].z)e[m].z--;
  72. }
  73. else if(abs(a[i].y-a[j].y)<=)
  74. {
  75. e[++m].x=i;e[m].y=j;
  76. e[m].z=abs(a[i].x-a[j].x)-;
  77. }
  78. int sum_v=,sum_n=;
  79. sort(e+,e+m+,cmp);
  80. for(int i=;i<=n;i++)fa[i]=i;
  81. for(int i=;i<=m;i++)
  82. {
  83. int aa=find(e[i].x),bb=find(e[i].y);
  84. if(aa!=bb)
  85. {
  86. fa[aa]=bb;
  87. sum_v+=e[i].z;
  88. if(e[i].z)sum_n++;
  89. }
  90. }
  91. printf("%d %d",sum_n,sum_v);
  92. }
  93. int main()
  94. {
  95. work1();
  96. work2();
  97. return ;
  98. }

搭桥(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. Python variable 作用域和初始化

    Python 根据LEGB rule在不同的namespace中找变量 在def的函数中对global 变量做修改还是不推荐的,应该将其作为参数传入函数 try: do_something() cnt ...

  2. Palindromic Subsets 数学 + 线段树

    https://www.hackerrank.com/contests/101hack44/challenges/palindromic-subsets 如果有3个a.2个b.1个c. 每个a看成不同 ...

  3. [书目20141009]《ReWork》

    ReWork1: ============= 引言篇INTRODUCTION开局篇FIRST 新的现实缷负篇TAKEDOWNS 忘了“现实世界” 哪来的从错误中学习 计划即瞎猜 何必壮大? 工作狂 受 ...

  4. SpringMVC的简单传值

    之前学习SpringMVC时感觉他的传值很神奇:简便,快捷,高效. 今天写几个简单的传值与大家分享,希望能对大家有帮助. 一. 从后往前传: (1) @Controller @RequestMappi ...

  5. 一致性hash学习

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...

  6. Windows下使用JMeter

    简介 Apache JMeter是100%纯java桌面应用程序,被设计用来测试C/S结构的软件(例如web应用程序).它可以被用来测试包括基于静态和动态资源程序的性能,例如静态文件,Java Ser ...

  7. swift class type isa-swizzling

    class 是引用类型,生成的实例分布在 Heap(堆) 内存区域上,在 Stack(栈)只存放着一个指向堆中实例的指针.因为考虑到引用类型的动态性和 ARC 的原因,class 类型实例需要有一块单 ...

  8. COMMIT - 提交当前事务

    SYNOPSIS COMMIT [ WORK | TRANSACTION ] DESCRIPTION 描述 COMMIT 提交当前事务. 所有事务的更改都将为其他事务可见,而且保证当崩溃发生时的可持续 ...

  9. C#反射的使用

    1.先定义个类,编译成dll,用于调用 nameSpace Test{ public class Class1 { private string _name; private int _age; pu ...

  10. CAS机制总结

    一.简介 CAS机制:(Compare and set)比较和替换 简单来说–>使用一个期望值来和当前变量的值进行比较,如果当前的变量值与我们期望的值相等,就用一个新的值来更新当前变量的值CAS ...