题目说从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. R与数据分析旧笔记(四)画地图练习

    > library(maps) > library(geosphere) 载入需要的程辑包:sp > map("state")#画美国地图 > map(&q ...

  2. Anndroid 开发架构读书笔记

    市面上大部分应用不外乎就是颠过来倒过去地做以下这些事情: --------------- --------------- --------------- --------------- | | | | ...

  3. JavaScript版排序算法

    JavaScript版排序算法:冒泡排序.快速排序.插入排序.希尔排序(小数据时,希尔排序会比快排快哦) //排序算法 window.onload = function(){ var array = ...

  4. Linux 查看文件

    1: cat file_full_name  这种方法适合查看小文件 cat /etc/services cat -n file_full_name -n 可以加行号! 2: tac file_ful ...

  5. 第八届河南省赛F.Distribution(水题)

    10411: F.Distribution Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 11  Solved: 8 [Submit][Status] ...

  6. uva 10763 Foreign Exchange(排序比较)

    题目连接:10763 Foreign Exchange 题目大意:给出交换学生的原先国家和所去的国家,交换成功的条件是如果A国给B国一个学生,对应的B国也必须给A国一个学生,否则就是交换失败. 解题思 ...

  7. Webform之(简单投票)练习

    创建数据库: CREATE table DiaoYanTiMu ( Ids int primary key ,--题目代号 Title varchar() not null ,--要调查的题目 Sel ...

  8. C#复习一( Twenty Days)

      今天开始将要复习最近所学的一些C#知识.下面就来总结一下今天所复习的内容,以此来巩固我对C#知识的掌握.今天主要以举几个程序为例. 首先还是要注意代码的规范: –注释//,/**/,/// –骆驼 ...

  9. C++面向对象类的书写相关细节梳理

    类的问题 继承类的原因:为了添加或者替换功能. 1. 继承时重写类的方法 v 替换功能 ① 将所有方法都设置为virtual(虚函数),以防万一. Virtual:经验表明最好将所有方法都设置为vir ...

  10. 记录:sea.js和require.js配置 与 性能对比

    最近有点忙,很久无写博客,记录一下之前的配置require.js和sea.js的配置.(有误有望提出 require.js 文件目录 /app(项目使用js) /lib(require.js jq存放 ...