poj 3026 Borg Maze bfs建图+最小生成树
题目说从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建图+最小生成树的更多相关文章
- 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 (bfs + 最小生成树)
链接:poj 3026 题意:y行x列的迷宫中,#代表阻隔墙(不可走).空格代表空位(可走).S代表搜索起点(可走),A代表目的地(可走),如今要从S出发,每次可上下左右移动一格到可走的地方.求到达全 ...
- POJ - 3026 Borg Maze bfs+最小生成树。
http://poj.org/problem?id=3026 题意:给你一个迷宫,里面有 ‘S’起点,‘A’标记,‘#’墙壁,‘ ’空地.求从S出发,经过所有A所需要的最短路.你有一个特殊能力,当走到 ...
- POJ 3026 Borg Maze bfs+Kruskal
题目链接:http://poj.org/problem?id=3026 感觉英语比题目本身难,其实就是个最小生成树,不过要先bfs算出任意两点的权值. #include <stdio.h> ...
- POJ 3026 Borg Maze【BFS+最小生成树】
链接: http://poj.org/problem?id=3026 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- 快速切题 poj 3026 Borg Maze 最小生成树+bfs prim算法 难度:0
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8905 Accepted: 2969 Descrip ...
- POJ 3026 Borg Maze(bfs+最小生成树)
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6634 Accepted: 2240 Descrip ...
- POJ 3026 --Borg Maze(bfs,最小生成树,英语题意题,卡格式)
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16625 Accepted: 5383 Descri ...
随机推荐
- JavaEE学习之设计模式
转自:http://mp.weixin.qq.com/s?__biz=MjM5OTMxMzA4NQ==&mid=221913387&idx=2&sn=d5d006300722f ...
- R与数据分析旧笔记(⑦)回归诊断
回归诊断 回归诊断 1.样本是否符合正态分布假设? 2.是否存在离群值导致模型发生较大误差? 3.线性模型是否合理? 4.误差是否满足独立性.等方差.正态分布等假设条件? 5.是否存在多重共线性 正态 ...
- 常用ajax请求
JQuery版本的ajax请求:(包括处理WebService中xml字符串) $.ajax({ type: "POST", async: true, url: "&qu ...
- ;(function( $, window, undefined ){ }(jQuery,window))为何需要往里面传$,window,undefined这些参数
(function( $, jQuery , undefined ) {})(jQuery); 为什么要将window和undefined作为参数传给它? 因为 ecmascript 执行JS代码是从 ...
- 高效的数组去重(js)
function uniqueArray(data){ data = data || []; var a = {}; for (var i=0; i<data.length; i++) { va ...
- python,redis简单订阅
python连接redis import redis r =redis.Redis(host='192.168.199.11',port = 6379 ,db = 0) r.publish('chan ...
- NYOJ 14 会场安排问题(也算是经典问题了)
会场安排问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就 ...
- 第七届河南省赛10403: D.山区修路(dp)
10403: D.山区修路 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 69 Solved: 23 [Submit][Status][Web Bo ...
- stl非变易算法(二)
这里接着上篇stl非变易算法(一)进行总结.主要解析算法函数count.count_if.mismatch.equal.search.search_n以及find_end.给出算法函数的实现及測试用例 ...
- Javascript对象的声明
JavaScript 对象 对象由花括号分隔.在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义.属性由逗号分隔: var person={firstname:" ...