题意:从S出发,去抓每一个A,求总路径最短长度。在S点和A点人可以分身成2人,不过一次只能让一个人走。

思路是先利用BFS求出各点之间的距离,建成图,再套用最小生成树模板。

一次性A了。不过觉得在判断第几个编号的点时稍显麻烦了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; const int inf=1000000;
const int maxn=205;
char mapp[maxn][maxn];
bool visit[maxn][maxn];
bool vis[maxn];
int dx[]= {-1,0,1,0}; //四个方向
int dy[]= {0,-1,0,1};
int mat[maxn][maxn],dis[maxn];
int cou,ans; struct Node
{
int x;
int y;
int s; //记录距离
int num; //点的编号
} next,nodes[maxn]; //nodes[]存所有的点
void bfs(Node node,int a)
{
memset(visit,0,sizeof(visit));
node.s=0;
mapp[node.y][node.x]=' '; //访问过后将'S'或'A'变成' ',下次不需重复访问
queue<Node>q;
visit[node.x][node.y]=true;
q.push(node);
while(!q.empty())
{
node=q.front();
if(mapp[node.y][node.x]=='A')
{
if(a==0)
{
nodes[cou]=node;
mat[a][cou]=mat[cou][a]=node.s;
cou++; //记录有多少个点
}
else
{
int b;
for(int j=0;; j++)
if(nodes[j].x==node.x && nodes[j].y==node.y)
{
b=nodes[j].num;
break;
}
mat[a][b]=mat[b][a]=node.s; //将距离写入对角矩阵
}
}
q.pop();
for(int i=0; i<4; i++)
{
next=node;
next.x=node.x+dx[i];
next.y=node.y+dy[i];
if(!visit[next.x][next.y] && (mapp[next.y][next.x]==' ' || mapp[next.y][next.x]=='A'))
{
visit[next.x][next.y]=true;
next.s=node.s+1;
q.push(next); }
}
}
return ;
}
bool prim()
{
memset(vis,0,sizeof(vis));
for(int i=0;i<cou;i++)
dis[i]=(i==0? 0:inf);
ans=0;
for(int i=0;i<cou;i++)
{
int temp=inf,k=0;
for(int j=0;j<cou;j++)
{
if(!vis[j] && dis[j]<temp )
{
temp=dis[j];
k=j;
}
}
if(temp==inf)
return false;
vis[k]=true;
ans+=temp;
for(int j=0;j<cou;j++)
{
if(!vis[j] && dis[j]>mat[k][j])
dis[j]=mat[k][j];
}
}
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--)
{
int x,y;
memset(mapp,0,sizeof(mapp));
scanf("%d%d",&x,&y);
char c[maxn]={0};
gets(c);
for(int i=0; i<y; i++)
gets(mapp[i]);
for(int i=0; i<x; i++)
for(int j=0; j<y; j++)
if(mapp[i][j]=='S')
{
nodes[0].y=i;
nodes[0].x=j;
}
bool flag=true;
cou=1;
for(int i=0; i<cou; i++)
{
bfs(nodes[i],i);
if(flag)
{
for(int j=0; j<cou; j++)
nodes[j].num=j; //给各个点编号,只运行一次
flag=false;
}
}
prim();
printf("%d\n",ans);
}
return 0;
}

POJ 3026 Borg Maze 广搜(BFS)+最小生成树的更多相关文章

  1. POJ 3026 Borg Maze(Prim+bfs求各点间距离)

    题目链接:http://poj.org/problem?id=3026 题目大意:在一个y行 x列的迷宫中,有可行走的通路空格’  ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用 ...

  2. POJ 3026 Borg Maze(Prim+BFS建邻接矩阵)

    ( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  3. poj 3026 Borg Maze (BFS + Prim)

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

  4. poj 3026 Borg Maze 最小生成树 + 广搜

    点击打开链接 Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7097   Accepted: 2389 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 二进制部署K8S-1基本概念

    二进制部署K8S-1基本概念 感谢老男孩教育王导的公开视频,文档整理自https://www.yuque.com/duduniao/k8s. 1.实验环境 1.1 虚拟机 因为在后期运行容器需要有大量 ...

  2. shell基础之for循环语句

    For语句 格式:for name [ [ in [ word ... ] ] ; ] do list ; done for 变量名 in 取值列表; do 命令 done 或者 for 变量名 in ...

  3. C语言函数sscanf()的用法-(转自Walter L)

    在我的学习过程中,从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int ss ...

  4. 文件包含之包含了Linux文件描述符

    0x00 原理   文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符. 翻译成人话- 可以认为是指向文件的一个指针,如果有文件 ...

  5. Tomcat 中文乱码

    问题描述 tomcat9启动后会有中文乱码,比如控制台乱码: startup.bat启动时乱码: 解决方法 打开"/apache-tomcat-9.0.20/conf/logging.pro ...

  6. [leetcode] 46. 全排列(Java)

    46. 全排列 这题我们可以借用31. 下一个排列写的nextPermutation函数来做,稍微改造一下即可 注意要先给nums排个序 class Solution { // 当没有下一个排列时re ...

  7. Java常用集合笔记

    最近事情比较少,闲暇之余温习巩固一下Java的一些基础知识,并做一些笔记, Java常用集合, 主要参考的这篇文章:Java常用集合 ArrayList/Vertor 1. ArrayList 的主要 ...

  8. openresty 学习笔记四:连接mysql和进行相关操作

    openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...

  9. sql批量插入缓慢

    1.有一个普通的表t_asset,只有2个字段id,ip 没有索引 2.当用insert into t_asset(id,ip) values(?,?),(?,?) 1200多条记录时,发现竟然用了3 ...

  10. OSPF-三张表+路由器角色+router-id

    验证理论: 1.剖析OSPF的三张表:邻居表,拓扑表,路由表 dis ospf peer brief dis ospf lsdb dis ip routing-table protocol ospf ...