题目描述 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. AndroidStudio ADB WIFI :adb wifi scan ip address

    笔记本使用Android studio的adb wifi插件时,AS 最下方报 adb wifi scan ip address.一直无法使用. 解决办法: ----在Terminal窗口中输入: a ...

  2. mysql标准规范

    一.基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字节,英文1字节 (2)utf8mb4是utf8的超集,有存储 ...

  3. opencv中对图片的二值化操作并提取特定颜色区域

    一.最近因为所在的实习公司要求用opencv视觉库来写一个对图片识别并提取指定区域的程序.看了很多资料,只学会了皮毛,下面附上简单的代码.运行程序之前需要安装opencv库,官网地址为:https:/ ...

  4. MySQL5.6解压版服务无法启动—系统错误1067

    记录一下今天被坑了一下午的BUG 就从半个月前说起吧 当时....................................................................... ...

  5. Excel透视表基础之字段布局与重命名、更新、数字格式设置、空值与错误值、

    字段布局与重命名 经典布局切换 字段布局 默认布局:文本类型在行区域.数字类型在值区域. 最好用鼠标拖拽. 字段重命名 可以在字段设置中更改. 透视表更新 延迟更新 手动刷新 自动刷新 刷新注意事项 ...

  6. 初步学习jquery学习笔记(六)

    jquery学习笔记六 AJAX 简介 AJAX 是与服务器交换数据的技术,它在不重载全部页面的情况下,实现了对部分网页的更新. load() 方法 load() 方法从服务器加载数据,并把返回的数据 ...

  7. Linux的环境变量.bash_profile .bashrc profile文件

    Shell变量有局部变量.环境变量之分.局部变量就是指在某个Shell中生效的变量,只在此次登录中有效.环境变量通常又称“全局变量”,虽然在Shell中变量默认就是全局的,但是为了让子Shall继承当 ...

  8. java压缩文件中文名乱码问题

    import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; 改为 import org.apache.tools.zip. ...

  9. Python3 A*寻路算法实现

    # -*- coding: utf-8 -*- import math import random import copy import time import sys import tkinter ...

  10. docker search - 搜寻镜像

    使用docker search 命令可以搜索docker hub官方仓库中的镜像. # docker search --help Usage: docker search [OPTIONS] TERM ...