题目链接:http://poj.org/problem?id=3026

题目大意:在一个y行 x列的迷宫中,有可行走的通路空格’  ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用最短的路径L连接所有字母,输出这条路径L的总长度。

解题思路:相当于所有的字母A和S都是结点,求连接这些结点的最小距离和,是最小生成树的题目。先用BFS求各点间的距离,然后再用Prim(Kruskal也可以)求出最小距离就可以了。

     注意:输完行列m和n之后,后面有一堆空格,要用gets()去掉,题目有问题,超级坑。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=1e2+;
const int MAXN=1e2+;
const int INF=0x3f3f3f3f; int n,m;
int d[][]={,,,-,-,,,};
int num[N][N],cost[N][N],root[MAXN],low[MAXN];
bool vis[N][N],used[MAXN];
char str[N][N]; struct node{
int x,y,step;
node(){}
node(int x,int y,int step){
this->x=x;
this->y=y;
this->step=step;
}
}pre; //(x,y)点到各个点之间的最短距离
void bfs(int x,int y){
memset(vis,false,sizeof(vis));
queue<node>q;
q.push(node(x,y,));
vis[x][y]=true;
while(!q.empty()){
pre=q.front();
q.pop();
for(int i=;i<;i++){
int xx=pre.x+d[i][];
int yy=pre.y+d[i][];
int t=pre.step+;
if(x<=||y<=||x>n||y>m||vis[xx][yy]||str[xx][yy]=='#')
continue;
if(str[xx][yy]=='S'||str[xx][yy]=='A')
cost[num[x][y]][num[xx][yy]]=t;
vis[xx][yy]=true;
q.push(node(xx,yy,t));
}
}
}
//Prim求最小生成树
int Prim(int cnt){
memset(used,false,sizeof(used));
for(int i=;i<=cnt;i++){
low[i]=cost[][i];
}
used[]=true;
int ans=;
for(int i=;i<cnt;i++){
int k=-;
for(int j=;j<=cnt;j++){
if(!used[j]&&(k==-||low[k]>low[j])){
k=j;
}
}
if(k==-||low[k]==INF) return -;
ans+=low[k];
used[k]=true;
for(int j=;j<=cnt;j++){
if(!used[j]&&low[j]>cost[k][j])
low[j]=cost[k][j];
}
}
return ans;
} int main(){
int t;
char tmp[];
scanf("%d",&t);
while(t--){
memset(cost,0x3f,sizeof(cost));
scanf("%d%d",&m,&n);
//注意行列后面有一大堆空格要用gets(),出题人怕是个智。。。
gets(tmp);
int cnt=;
for(int i=;i<=n;i++){
gets(str[i]+);
for(int j=;j<=m;j++){
if(str[i][j]=='S'||str[i][j]=='A')
num[i][j]=++cnt;
}
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(str[i][j]=='S'||str[i][j]=='A'){
bfs(i,j);
}
}
}
printf("%d\n",Prim(cnt));
}
return ;
}

POJ 3026 Borg Maze(Prim+bfs求各点间距离)的更多相关文章

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

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

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

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

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

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

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

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

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

    有几个错误,调试了几个小时,样例过后 1Y. 题目:http://poj.org/problem?id=3026 题意:就是让求A们和S的最小生成树 先用bfs找每两点的距离,再建树.没剪枝 63MS ...

  6. poj 3026 Borg Maze (BFS + Prim)

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

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

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

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

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

  9. POJ 3026 Borg Maze 广搜(BFS)+最小生成树

    题意:从S出发,去抓每一个A,求总路径最短长度.在S点和A点人可以分身成2人,不过一次只能让一个人走. 思路是先利用BFS求出各点之间的距离,建成图,再套用最小生成树模板. 一次性A了.不过觉得在判断 ...

随机推荐

  1. 不使用java内置函数,将String字符串转换为int类型

    package com.test; public class AtoiTest { public static void main(String[] args) throws Exception { ...

  2. 【Visual Installer】如何注册自已的文件类型

    一.前言 这几天在做公司软件产品的安装包,产品有一个特定的后缀名为:.isbimqs,需要的功能是双击该后缀名文件后,会有一个启动程序launchRevit.exe去打开Revit,由Revit去打开 ...

  3. 【BZOJ2878】【NOI2012】迷失游乐园(动态规划)

    [BZOJ2878][NOI2012]迷失游乐园(动态规划) 题面 BZOJ 题解 记得以前考试的时候做过这道题目 这题的暴力还是非常显然的,每次\(dfs\)一下就好了. 时间复杂度\(O(n^2) ...

  4. 洛谷 P1501 [国家集训队]Tree II 解题报告

    P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...

  5. SSH不能连接并提示REMOTE HOST IDENTIFICATION HAS CHANGED解决

    SSH不能连接并提示REMOTE HOST IDENTIFICATION HAS CHANGED解决方法: 如果提示信息如下: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  6. 【bzoj4571】美味

    Portal -->bzoj4571 Solution emmm持续智力康复.. 虽然说因为统计的是加上\(x\)的跟\(b\)异或的最大值所以可持久化trie用不了了 ​ 但是按位贪心的思想还 ...

  7. 在github fork的项目中推送与抓取

    github -- fork提交项目:自己的仓库和原仓库进行Git同步的操作. 1. 获取你fork的原仓库的更新过的最新代码:如果没有远程原始分支则需要增加. git remote add upst ...

  8. C/C++中如何计算程序运行的时间

    一个程序的功能通常有很多种方法来实现,怎么样的程序才算得上最优呢?举个例子,如果实现同一个功能的两个程序,一个一点按钮就给出运行结果,而另一个则需要漫长的时间去等待,就像安装WINDOWS XP一样( ...

  9. HDU 6038

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  10. 手脱ACProtect v1.35(无Stolen Code)

    1.载入PEID ACProtect v1.35 -> risco software Inc. & Anticrack Soft 2.载入OD,需要注意的是,异常选项除了[内存访问异常] ...