codevs 1002 搭桥x
有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物。现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建,如下图城市1有5栋建筑物,可以搭建4座桥将建筑物联系起来。城市2有两座建筑物,但不能搭建桥梁将它们连接。城市3只有一座建筑物,城市4有3座建筑物,可以搭建一座桥梁联系两栋建筑物,但不能与第三座建筑物联系在一起。

在输入的数据中的第一行包含描述城市的两个整数r 和c, 分别代表从北到南、从东到西的城市大小(1 <= r <= 50 and 1 <= c <= 50). 接下来的r 行, 每一行由c 个(“#”)和(“.”)组成的字符. 每一个字符表示一个单元格。“#”表示建筑物,“.”表示空地。
在输出的数据中有两行,第一行表示建筑物的数目。第二行输出桥的数目和所有桥的总长度。
样例1
3 5
#...#
..#..
#...#
样例2
3 5
##...
.....
....#
样例3
3 5
#.###
#.#.#
###.#
样例4:
3 5
#.#..
.....
....#
样例1
5
4 4
样例2
2
0 0
样例3
1
0 0
样例4
3
1 1
见描述
分类标签 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的更多相关文章
- codevs 1002 搭桥
codevs 第一道题 先贴描述 1002 搭桥 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description ...
- 搭桥(codevs 1002)
题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...
- 【wikioi】1002 搭桥(dfs+最小生成树)
http://wikioi.com/problem/1002/ 今天开始又开始刷水了哈T_T.照着hzwer神犇的刷题记录刷!!! 题解: 一开始我也不会,但是我想到了直接爆搜T_T. 好吧,题解. ...
- Code VS 1002 搭桥
题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...
- 1、Codevs 必做:2833、1002、1003、2627、2599
2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困 ...
- 搭桥|codevs1002|最小生成树|Prim|并查集|Elena
1002 搭桥 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点 ...
- T1002 搭桥 codevs
http://codevs.cn/problem/1002/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一矩形区域的城 ...
- Codevs 1010 过河卒== 洛谷 1002
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同 ...
- 【codevs】刷题记录→_→(推荐看!)
注:本文是我原先在csdn内写的一篇博文,现转到这里,两篇博文尽量同时更新. //#include<iostream->shuati> //define 为什么刷 学长☞hzwer ...
随机推荐
- DataGridViewCheckBoxColumn的Value值和EditFormatedValue值不一致
今天要做一个代码修改DataGridViewCheckBoxColumn的Value值然后再遍历获取DataGridview选中项,因为遍历的时候为了能获取跟界面一致的选项,所以判断是否选中使用的是E ...
- python map 的用法
map的用法 ——.我们来分析map在python的源码 class map(object): """ map(func, *iterables) --> map ...
- switch-case分支结构总结
1,格式 switch(表达式){ case 常量1:执行语句1: case 常量1:执行语句1: ... ... case 常量n:执行语句n: default:执行语句:} 2,说明: 根据swi ...
- 从零开始学习GDI+ (二) 基本概念与基本操作
从零开始学习GDI+ (一)我的第一个GDI+程序 上文给新手学习GDI+讲述了vs环境等的准备工作,并且可以直接用GDI+绘图了.本文开始,讲述的可能偏理论,建议学习的过程中大胆尝试,多使用API. ...
- python requests的content和text方法的区别【转】
requests对象的get和post方法都会返回一个Response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等.其中返回的网页部分会存在.content和.text两个对 ...
- 剑指offer-连续子数组的最大和-数组-python
题目描述 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止). 给一个数组,返回它的最大连续子序列的和 思路:动态规划 # -*- coding:u ...
- 6.jQuery之类操作不影响原先类,but原生js却是会影响
注意jQuery和js的区别: <style> .one { width: 200px; height: 200px; background-color: pink; transition ...
- C++中如何实现split的效果?
C++中如何实现split的效果? 和Python等语言不同,C++的string类没有内置split函数,这对于实际应用中要经常分割字符串的情况非常不方便.有很多种方法来处理,这里讲一种比较方(to ...
- JS作用域及域解析规则
1.JS作用域:变量和函数作用的范围. 2.JS解析器可以分为域解析和逐行解读代码两个过程. 域解析:1.当进行域解析的时候,一旦找到var,就会提取后面的变量名,并给它赋值给undefined. 2 ...
- 表格强制换行 table-layout:fixed
如果想要一个table固定大小,里面的文字强制换行(尤其是在一长串英文文本,并且中间无空格分隔的情况下),以达到使过长的文字不撑破表格的目的,一般是使用样式:table-layout:fixed.