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 ...
随机推荐
- AspNet Core Swagger4.0 生成请求model描述
今天给大家分享 swagger 俩个冷门的小技巧 获取控制器描述 将 IncludeXmlComments 方法第二个参数设置为 true 即可 public static void IncludeX ...
- Java 并发编程:核心理论(一)
前言......... 并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密,这样才能写出高效.安全.可 ...
- python 并发编程 多线程 死锁现象与递归锁
一 死锁现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等 ...
- urllib库:解析链接
1from urllib.parse import urlparse, urlunparse, urlsplit, urlunsplit, urljoin, urlencode, parse_qs, ...
- 父进程pid和子进程pid的大小关系
如果进程ID最大值没有达到系统进程数的上限,子进程比父进程ID大.但是如果进程ID达到上限,系统会分配之前分配但是已经退出的进程ID给新进程,这样有可能出现子进程ID比父进程小.
- Dango之初识安装
1. MVC和MTV框架 1.1MVC Web服务器开发领域里著名的MVC模式 所谓MVC就是把Web应用分为模型(M), 控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起 ...
- $NOI$ $2019$ 网络同步赛
D2T1考试前测了自己造的“假”极限数据,看了看内存发现是118MB,感觉没问题就交上去了. 赛后用Lemon测了一下:MLE 88->0 对于别的题我已经不想再说什么了. update: 由于 ...
- 解决sudo用户找不到环境变量的问题
出于安全方面的考虑,使用sudo执行命令将在一个最小化的环境中执行,环境变量都重置成默认状态.所以PATH这个变量不包括用户自定义设置的内容 在sudo用户的主目录里的.bashrc中添加如下内容即可 ...
- Elasticsearch入门教程(三):Elasticsearch索引&映射
原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...
- 关于python3.4版本中的zip函数
特别注意: 在window,显示变量 print(x);而在linux中 print x 例如,有两个列表: >>>a = [1,2,3] >>>b = [4,5, ...