题目描述 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. selenium webdriver学习(六)------------如何得到弹出窗口

    selenium webdriver学习(六)------------如何得到弹出窗口 在selenium 1.X里面得到弹出窗口是一件比较麻烦的事,特别是新开窗口没有id.name的时候.当时还整理 ...

  2. 修改Docker0网桥默认网段

    Docker--修改Docker0网桥默认网段 修改文件 /etc/docker/daemon.json 添加内容 "bip": "ip/netmask" [ ...

  3. [转帖]什么是 LLVM?Swift, Rust, Clang 等语言背后的支持

    要了解用于以编程方式生成机器原生代码的编译器框架是如何让新语言的推出以及对现有的语言进行增强比以往更加容易了. https://www.oschina.net/translate/what-is-ll ...

  4. spring配置添加多个事务(转)

    大多数项目只需要一个事务管理器.然而,有些项目为了提高效率.或者有多个完全不同又不相干的数据源,最好用多个事务管理器.机智的Spring的Transactional管理已经考虑到了这一点,首先分别定义 ...

  5. eclipse project--->clean作用

    eclipse project-->clean  ,clean主要是class文件删除,并同时编译新的工程,生成新的class文件. 如果修改代码后,在运行时,还是旧代码,可能class文件还是 ...

  6. IDEA配置远程git仓库

    一,在项目创建本地仓储 2,选择当前文件夹为本地仓储 3, 将代码添加到本地仓库 4,提交到本地仓库 5,提交到本地仓库 配置远程账号和地址 输入你自己的远程仓库----码云或者github,创建的 ...

  7. ES使用text类型字段排序报错

    elasticsearch text字段排序报错解决使用elasticsearch 进行排序的时候,我们一般都会排序数字.日期.但是在排序text类型的时候就会出现错误. GET xytest/sut ...

  8. UnknownPropertyException(Yii2)

    在class里面的rule有属性,但是没声明

  9. vuex的简单理解

    初次接触vuex,谈谈我自己的理解.有待后期改进 首先要知道,Vuex 是专门为 Vue.js 设计的状态管理库.我们知道在用vue.js进行前端项目开发时,会出现很多组件相互之间调用属性.状态,小项 ...

  10. MySQL安装+Navicat_Premium(安装+破解)+Navicat_Premium中MySQL的localhost不能正常连接+不能连接Docker启动容器中的MySQL

    MySQL安装 安装MySQL 我这里安装的是 MySQL 8.0 Command Line Client 下载+安装 详情见 https://www.cnblogs.com/taopanfeng/p ...