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

见描述

分类标签 Tags 点此展开

1)WA了第0个点代码qwq(根本想不到哪里错了):

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm> using namespace std; const int M = 5e4 + ;
const int S = ;
int r,c,num,cnt,ans,sum;// #building .空地
int d[S][S];
char qq[M];
bool vis[S][S];
int f[M];
int h[]= {, ,,, ,-,-,-}, //8个方向
z[]= {,-,,,-, , ,-};
//右 左 下 右下 左下 上 右上 右下 struct Q {
int Qx,Qy;
int v;
bool operator < (const Q &qwq)const
{
return v < qwq.v;
}
} a[]; int find(int x)
{ return x == f[x] ? x : f[x] = find(f[x]); } bool P(int x1,int y1,int x2,int y2,int t)//t为编号
{
if(x2< || x2>r || y2< || y2>c || !d[x2][y2])
return ;
if(d[x1][y1]==d[x2][y2])
return ;
cnt++;
a[cnt].Qx=d[x1][y1];
a[cnt].Qy=d[x2][y2];
a[cnt].v=t-;
return ;
} void build(int x,int y)
{
for(int i=x+; i<=r; i++)
if(!P(x,y,i,y,i-x)
||!P(x,y,i,y+,i-x)
||!P(x,y,i,y-,i-x))
break;
for(int i=x-; i>; i--)
if(!P(x,y,i,y,x-i)
||!P(x,y,i,y+,x-i)
||!P(x,y,i,y-,x-i))
break;
for(int i=y+; i<=c; i++)
if(!P(x,y,x,i,i-y)
||!P(x,y,x+,i,i-y)
||!P(x,y,x-,i,i-y))
break;
for(int i=y-; i>; i--)
if(!P(x,y,x,i,y-)
||!P(x,y,x+,i,y-i)
||!P(x,y,x-,i,y-i))
break;
} void ss(int x,int y)
{
d[x][y]=num;
int xx,yy;
for(int i=; i<; i++) //搜索
{
xx=x+h[i];
yy=y+z[i];
if(vis[xx][yy] && !d[xx][yy])
ss(xx,yy);
}
} void readin()
{
cin>>r>>c;
for(int i=; i<=r; i++)
{
cin>>qq;
for(int j=; j<=c; j++)
if(qq[j-]=='#')
vis[i][j]=;
}
} void works()
{
for(int i=; i<=r; i++)
{
for(int j=; j<=c; j++)
{
if(vis[i][j] && !d[i][j])
{
num++;
ss(i,j);
}
}
}
cout<<num<<endl; for(int i=; i<=r; i++)
for(int j=; j<=c; j++)
if(vis[i][j])
build(i,j);
for(int i=; i<=num; i++)
f[i]=i; //初始化
sort(a+,a++cnt);
int f1,f2;
for(int i=; i<=cnt; i++)
{
f1=find(a[i].Qx);
f2=find(a[i].Qy);
if(f1!=f2)
{
f[f1]=f2;
ans++;
sum+=a[i].v;
}
}
cout<<ans<<" "<<sum;
} int main()
{
readin();
works();
return ;
}

2)AC代码:

#include <iostream>
#include <algorithm>
#define maxn 100000 using namespace std; const int M = ;
const int xx[] = {, ,,, ,-,-,-},
yy[] = {,-,,,-, , ,-};
int n,m,q[M][M],dad[maxn],cnt,ans,sum;
bool map[M][M]; struct node {
int x,y,v;
bool operator < (const node &qwq)const
{
return v < qwq.v;
}
} e[maxn]; int getdad(int x)
{ return x == dad[x] ? x : dad[x] = getdad(dad[x]); } bool input(int x1,int y1,int x2,int y2,int t)
{
if(x2<||x2>n||y2<||y2>m||!q[x2][y2])
return ;
if(q[x1][y1]==q[x2][y2])
return ;
cnt++;
e[cnt].x=q[x1][y1];
e[cnt].y=q[x2][y2];
e[cnt].v=t-;
return ;
} void dfs(int x,int y)
{
q[x][y]=ans;
for(int i=; i<; i++)
{
int x0=x+xx[i],y0=y+yy[i];
if(map[x0][y0] && !q[x0][y0])
dfs(x0,y0);
}
} void build(int x,int y)
{
for(int i=x+; i<=n; i++)
if(!input(x,y,i,y,i-x)
||!input(x,y,i,y+,i-x)
||!input(x,y,i,y-,i-x))
break;
for(int i=x-; i>; i--)
if(!input(x,y,i,y,x-i)
||!input(x,y,i,y+,x-i)
||!input(x,y,i,y-,x-i))
break;
for(int i=y+; i<=m; i++)
if(!input(x,y,x,i,i-y)
||!input(x,y,x+,i,i-y)
||!input(x,y,x-,i,i-y))
break;
for(int i=y-; i>; i--)
if(!input(x,y,x,i,y-)
||!input(x,y,x+,i,y-i)
||!input(x,y,x-,i,y-i))
break;
} void work1()
{
ans=;
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
if(map[i][j] && !q[i][j])
{
ans++;
dfs(i,j);
}
cout<<ans<<endl;
} void work2()
{
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
if(map[i][j])
build(i,j);
sort(e+,e+cnt+);
for(int i=; i<=ans; i++)
dad[i]=i;
ans=;
for(int i=; i<=cnt; i++)
{
int k=getdad(e[i].x);
int l=getdad(e[i].y);
if(k!=l)
{
dad[k]=l;
ans++;
sum+=e[i].v;
}
}
cout<<ans<<' '<<sum;
} int main()
{
cin>>n>>m;
for(int i=; i<=n; i++)
{
char a[maxn];
cin>>a;
for(int j=; j<=m; j++)
if(a[j-]=='#')
map[i][j]=;
}
work1();
work2();
return ;
}

codevs 1002 搭桥x的更多相关文章

  1. codevs 1002 搭桥

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

  2. 搭桥(codevs 1002)

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

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

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

  4. Code VS 1002 搭桥

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

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

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

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

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

  7. T1002 搭桥 codevs

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

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

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

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

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

随机推荐

  1. 深入理解java:2.4. 线程本地变量 java.lang.ThreadLocal类

    ThreadLocal,很多人都叫它做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多. 可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那样每个线程可以访问自己内 ...

  2. mysql——单表查询——聚合函数——概念

    使用聚合函数查询 group by关键字通常和聚合函数一起使用 .count()函数 count()函数用来统计记录的条数 举例:使用count()函数统计employee表的记录数 select c ...

  3. laravel5.5学习2-路由系统

    一.初识路由 路由系统是所有 PHP 框架的核心,路由承载的是 URL 到代码片段的映射,不同的框架所附带的路由系统是这个框架本质最真实的写照,一丝不挂,一览无余.Laravel 路由中文文档:htt ...

  4. UDP协议&socketserver模块

    UDP协议&socketserver模块 一.UDP协议 1.1 UDP实现简单通信 服务器 ------------------------------------------------- ...

  5. Executor框架(转)

    摘要:        Executor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相 ...

  6. synchronize和lock的区别 & synchionzie与volatile的区别

    synchronized与Lock的区别 https://www.cnblogs.com/iyyy/p/7993788.html Lock和synchronized和volatile的区别和使用 ht ...

  7. Jquery复习(二)之stop()易忘点

    jQuery stop() 方法 jQuery stop() 方法用于停止动画或效果,在它们完成之前. stop() 方法适用于所有 jQuery 效果函数,包括滑动.淡入淡出和自定义动画. 语法:$ ...

  8. 定义一个Book类,有书名,价格,作者等信息。定义相应的方法来改变这些属性的值。定义一个方法来显示Book的所有信息。

    package com.fs.test; public class Test { public static void main(String[] args) { // 先声明后赋值 book b;/ ...

  9. CDH部署StreamSets

    StreamSets是一个大数据采集工具,数据源支持包括结构化和半/非结构化,目标源支持HDFS,HBase,Hive,Kudu,Cloudera Search, ElasticSearch等.它包括 ...

  10. linux下重启tomcat命令

    在Linux系统下,重启Tomcat使用命令操作的! 首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh 查看 ...