题目说从S开始,在S或者A的地方可以分裂前进。 想一想后发现就是求一颗最小生成树。

首先bfs预处理得到每两点之间的距离,我的程序用map做了一个映射,将每个点的坐标映射到1-n上,这样建图比较方便。

然后一遍prime就够了。注意用gets()读入地图的时候,上面还要用一个gets()接住无用的空格。。(为啥不用getchar?0 0,看了讨论版才知道,

因为空格很多………………)

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<iostream>
using namespace std;
#define INF 0x3f3f3f3f
char map1[55][55];
int head,tail;
int x,y;
map<int,int> M;
struct node
{
int x,y;
int dis;
}q[100000];
int top;
int start;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int dis[150][150];
bool vis[150][150];
void bfs(int k,int st)
{
memset(vis,0,sizeof(vis));
head=tail=0;
node tmp,tt;
tmp.x=st/x;
tmp.y=st%x;
vis[tmp.x][tmp.y]=1;
tmp.dis=0;
int tot=0;
q[tail++]=tmp;
int f;
while(head<tail)
{
tmp=q[head];
for(int d=0;d<4;d++)
{
tt=tmp;
tt.x+=dx[d];
tt.y+=dy[d];
tt.dis++;
if(map1[tt.x][tt.y]!='#'&&!vis[tt.x][tt.y])
{
vis[tt.x][tt.y]=1;
if(f=M[tt.x*x+tt.y])
{
tot++;
dis[k][f]=tt.dis;
}
q[tail++]=tt;
if(tot==top) return;
}
}
head++;
}
}
int n,sum;
int visit[150],d[150];
void prime(int n)
{
int i,j,min,v;
sum=0;
for(i=1;i<=n;i++)
{
d[i]=dis[1][i];
visit[i]=0;
}
visit[1]=1;
for(i=1;i<n;i++)
{
min=INF;
v=1;
for(j=1;j<=n;j++)
{
if(!visit[j]&&min>d[j])
{
min=d[j];
v=j;
}
}
sum+=min;
visit[v]=1;
for(j=1;j<=n;j++)
{
if(!visit[j]&&dis[v][j]<d[j])
d[j]=dis[v][j];
}
}
}
int main()
{
char tmp[1000];
int cas;
scanf("%d",&cas);
while(cas--)
{
memset(dis,0x3f,sizeof(dis));
M.clear();
top=0;
scanf("%d%d",&x,&y); gets(tmp);//接住空格
for(int i=0;i<y;i++){
gets(map1[i]);
}
for(int i=1;i<y-1;i++)
{
for(int j=1;map1[i][j];j++)
{
if(map1[i][j]=='A'||map1[i][j]=='S')
{
top++;
if(map1[i][j]=='S') start=top;
M[i*x+j]=top;
dis[top][top]=0; }
}
}
for(int i=1;i<y-1;i++)
{
for(int j=1;map1[i][j];j++)
{
if(map1[i][j]=='A'||map1[i][j]=='S')
{
bfs(M[i*x+j],i*x+j);
}
}
}
prime(top);
printf("%d\n",sum);
}
return 0;
}

poj 3026 Borg Maze bfs建图+最小生成树的更多相关文章

  1. poj 3026 Borg Maze (BFS + Prim)

    http://poj.org/problem?id=3026 Borg Maze Time Limit:1000MS     Memory Limit:65536KB     64bit IO For ...

  2. POJ - 3026 Borg Maze BFS加最小生成树

    Borg Maze 题意: 题目我一开始一直读不懂.有一个会分身的人,要在一个地图中踩到所有的A,这个人可以在出发地或者A点任意分身,问最少要走几步,这个人可以踩遍地图中所有的A点. 思路: 感觉就算 ...

  3. poj 3026 Borg Maze (bfs + 最小生成树)

    链接:poj 3026 题意:y行x列的迷宫中,#代表阻隔墙(不可走).空格代表空位(可走).S代表搜索起点(可走),A代表目的地(可走),如今要从S出发,每次可上下左右移动一格到可走的地方.求到达全 ...

  4. POJ - 3026 Borg Maze bfs+最小生成树。

    http://poj.org/problem?id=3026 题意:给你一个迷宫,里面有 ‘S’起点,‘A’标记,‘#’墙壁,‘ ’空地.求从S出发,经过所有A所需要的最短路.你有一个特殊能力,当走到 ...

  5. POJ 3026 Borg Maze bfs+Kruskal

    题目链接:http://poj.org/problem?id=3026 感觉英语比题目本身难,其实就是个最小生成树,不过要先bfs算出任意两点的权值. #include <stdio.h> ...

  6. POJ 3026 Borg Maze【BFS+最小生成树】

    链接: http://poj.org/problem?id=3026 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...

  7. 快速切题 poj 3026 Borg Maze 最小生成树+bfs prim算法 难度:0

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8905   Accepted: 2969 Descrip ...

  8. POJ 3026 Borg Maze(bfs+最小生成树)

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6634   Accepted: 2240 Descrip ...

  9. POJ 3026 --Borg Maze(bfs,最小生成树,英语题意题,卡格式)

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16625   Accepted: 5383 Descri ...

随机推荐

  1. JS 操作日期

    var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-???? ...

  2. 安卓2D游戏开发设置

    http://www.cnblogs.com/xiaominghimi/archive/2010/12/23/1921402.html

  3. codeforces 377B Preparing for the Contest 二分+优先队列

    题目链接 给你m个bug, 每个bug都有一个复杂度.n个人, 每个人有两个值, 一个是能力值, 当能力值>=bug的复杂度时才可以修复这个bug, 另一个是雇佣他需要的钱,掏一次钱就可以永久雇 ...

  4. Android中自定义属性的使用

    做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...

  5. C功底挑战Java菜鸟入门概念干货(一)

    一.认识Java 1.Java 程序比较特殊,它必须先经过编译,然后再利用解释的方式来运行.  2.Byte-codes 最大的好处是——可越平台运行,可让“一次编写,处处运行”成为可能.  3.使用 ...

  6. ThinkPHP 3 的CURD介绍

    本节课大纲: 一.ThinkPHP 3 的CURD介绍 (了解) 二.ThinkPHP 3 读取数据 (重点) 对数据的读取 Read $m=new Model('User'); $m=M('User ...

  7. 10491 - Cows and Cars

    描述:要么全选择牛,要么选择一辆车和p-1头牛,那么剩下n+m-p道门可以选择,求选择p道门以后要选择到车的概率 #include <cstdio> int main() { //freo ...

  8. uva 10905 Children's Game (排序)

    题目连接:uva 10905 Children's Game 题目大意:给出n个数字, 找出一个序列,使得连续的数字组成的数值最大. 解题思路:排序,很容易想到将数值大的放在前面,数值小的放在后面.可 ...

  9. Android Animation学习(一) Property Animation介绍

    Android Animation Android framework提供了两种动画系统: property animation (introduced in Android 3.0)和view an ...

  10. MVC Razor中 如何截断字符串

    有时候显示的内容过长,使用MVC编程时,如何截断显示的内容呢.我知道你肯定有很多办法这样做的,但是在学习MVC时,还是使用一些新的办法做吧> Razor 标记语法编程. @helper Trun ...