poj 3026 Borg Maze (bfs + 最小生成树)
题意:y行x列的迷宫中,#代表阻隔墙(不可走)。空格代表空位(可走)。S代表搜索起点(可走),A代表目的地(可走),如今要从S出发,每次可上下左右移动一格到可走的地方。求到达全部的A的路线总距离最小值
分析:能够先用bfs从上下左右四个方向将全部的A,S两两之间的最短距离,题目的目的是将S与全部的A连通,使得总距离最小,所以任选一点開始按最小生成树的算法做即可,并不是非要从S点開始
注:题目输入x,y后可能有非常多空格,能够用gets将多余的空格取走,开数组是尽量开大点。之前尽管开的比题目数据稍大,但一直错,改大就AC了、、、题目数据不忍直视
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
int m,n,x,y,f[1050],num[1050][1050]; //之前都是105
struct point
{
int i,j;
}a[1050];
struct stu
{
int a,b,c;
}t[100500]; //之前开的10050
char s[100][100];
int cmp(struct stu x1,struct stu x2)
{
return x1.c<x2.c;
}
void bfs(int star)
{
int i,j,k,dis[100][100],v[100][100];
queue<struct point> q;
struct point d;
memset(dis,0,sizeof(dis));
memset(v,0,sizeof(v));
q.push(a[star]);
v[a[star].i][a[star].j]=1;
while(!q.empty()){
d=q.front();
q.pop();
i=d.i;
j=d.j;
if(s[i][j]=='A'||s[i][j]=='S'){
t[m].a=star;
t[m].b=num[i][j];
t[m++].c=dis[i][j];
}
for(k=0;k<4;k++)
{
d.i=i+dx[k];
d.j=j+dy[k];
if(d.i>=0&&d.i<y&&d.j>=0&&d.j<x&&!v[d.i][d.j]&&s[d.i][d.j]!='#')
{
q.push(d);
v[d.i][d.j]=1;
dis[d.i][d.j]=dis[i][j]+1;
}
}
}
}
int find(int r)
{
if(r!=f[r])
f[r]=find(f[r]);
return f[r];
}
int krus()
{
int i,k=0,sum=0,l,r;
for(i=1;i<m;i++){
l=find(t[i].a);
r=find(t[i].b);
if(l!=r){
sum+=t[i].c;
k++;
if(k==n-1)
break;
f[l]=r;
}
}
return sum;
}
int main()
{
int N,i,j,sum;
char c[55];
scanf("%d",&N);
while(N--){
scanf("%d%d",&x,&y);
gets(c); //将多余空格取走
n=1;
for(i=0;i<y;i++){
gets(s[i]);
for(j=0;j<x;j++)
if(s[i][j]=='A'||s[i][j]=='S'){
a[n].i=i; //存A或S的坐标
a[n].j=j;
num[i][j]=n++; //存点的序号
}
}
n--;
m=1;
for(i=1;i<=n;i++){
f[i]=i; //初始化父节点
bfs(i); //求以i为一个顶点的全部边的权值
}
sort(t+1,t+m,cmp);
sum=krus();
printf("%d\n",sum);
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
poj 3026 Borg Maze (bfs + 最小生成树)的更多相关文章
- POJ - 3026 Borg Maze bfs+最小生成树。
http://poj.org/problem?id=3026 题意:给你一个迷宫,里面有 ‘S’起点,‘A’标记,‘#’墙壁,‘ ’空地.求从S出发,经过所有A所需要的最短路.你有一个特殊能力,当走到 ...
- poj 3026 Borg Maze (BFS + Prim)
http://poj.org/problem?id=3026 Borg Maze Time Limit:1000MS Memory Limit:65536KB 64bit IO For ...
- POJ - 3026 Borg Maze BFS加最小生成树
Borg Maze 题意: 题目我一开始一直读不懂.有一个会分身的人,要在一个地图中踩到所有的A,这个人可以在出发地或者A点任意分身,问最少要走几步,这个人可以踩遍地图中所有的A点. 思路: 感觉就算 ...
- POJ 3026 Borg Maze (最小生成树)
Borg Maze 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/I Description The Borg is an im ...
- poj 3026 Borg Maze(最小生成树+bfs)
题目链接:http://poj.org/problem?id=3026 题意:题意就是从起点开始可以分成多组总权值就是各组经过的路程,每次到达一个‘A'点可以继续分组,但是在路上不能分组 于是就是明显 ...
- poj 3026 Borg Maze bfs建图+最小生成树
题目说从S开始,在S或者A的地方可以分裂前进. 想一想后发现就是求一颗最小生成树. 首先bfs预处理得到每两点之间的距离,我的程序用map做了一个映射,将每个点的坐标映射到1-n上,这样建图比较方便. ...
- POJ 3026 Borg Maze bfs+Kruskal
题目链接:http://poj.org/problem?id=3026 感觉英语比题目本身难,其实就是个最小生成树,不过要先bfs算出任意两点的权值. #include <stdio.h> ...
- POJ - 3026 Borg Maze(最小生成树)
https://vjudge.net/problem/POJ-3026 题意 在一个y行 x列的迷宫中,有可行走的通路空格’ ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用最短的 ...
- POJ 3026 Borg Maze【BFS+最小生成树】
链接: http://poj.org/problem?id=3026 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
随机推荐
- “MEAN”技术栈开发web应用
“MEAN”技术栈开发web应用 上一篇我们讲了如何使用angular搭建起项目的前端框架,前端抽象出一个service层来向后端发送请求,后端则返回相应的json数据.本篇我们来介绍一下,如何在no ...
- hive的udf制剂
1.配置环境 1.介绍jar包裹:hive-exec-0.8.0.jar 和 hadoop-core-0.20.2.jar 2.书写udf性能 1.extends UDF 2.又一次定义UDF的eva ...
- Android 儿子Activity在启动过程中的流程组件 && 儿子Activity在一个新的进程组件启动过程
1.儿子Activity在启动过程中的流程组件 在Android Activity启动过程http://blog.csdn.net/jltxgcy/article/details/35984557一文 ...
- Base64编码 概念和用途
Base64概念 什么是Base64? 依照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把随意序列的8位字节描写叙述为一种不易被人直接识别的形式.(The Base6 ...
- dba_dependencies查询结果视图
[oracle@rhel63single ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Fri Mar 13 0 ...
- 思考的工作方式——计划经济or市场经济
背景:单位成立了技术领先的基础部门.专注于产品规划的技术解决方案部门.产品的发展规划方向.批准的项目和各部门的其他工作方案.工作内容是在这一领域没有问题.毕竟,从过去企业发展的一个部门模型现在是一个功 ...
- PAAS平台7×24小时可用性应用设计
如今非常多企业都在搭建自己的私有PAAS平台,当然也有非常多大型互联网公司搭建共同拥有PAAS平台(比如SAE/BAE/JAE(jae.jd.com)).那么使用PAAS平台来部署SAAS应用有哪些优 ...
- Eclipse 发布到网站的附加产品的形式 Update Site
Eclipse 发布到网站的附加产品的形式 Update Site 通过Update Site Project项目将自己做的插件产品公布到公网上,给客户或其它測试人员下载和应用,这样自己的插件就以网站 ...
- android app启动过程(转)
Native进程的运行过程 一般程序的启动步骤,可以用下图描述.程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行. 通常,native进程是由shell或者init启 ...
- Codeforces 448 D. Multiplication Table
二分法判断答案 D. Multiplication Table time limit per test 1 second memory limit per test 256 megabytes inp ...