poj 3026(BFS+最小生成树)
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 12032 | Accepted: 3932 |
Description
Your task is to help the Borg (yes, really) by developing a program
which helps the Borg to estimate the minimal cost of scanning a maze for
the assimilation of aliens hiding in the maze, by moving in north,
west, east, and south steps. The tricky thing is that the beginning of
the search is conducted by a large group of over 100 individuals.
Whenever an alien is assimilated, or at the beginning of the search, the
group may split in two or more groups (but their consciousness is still
collective.). The cost of searching a maze is definied as the total
distance covered by all the groups involved in the search together. That
is, if the original group walks five steps, then splits into two groups
each walking three steps, the total distance is 11=5+3+3.
Input
the first line of input there is one integer, N <= 50, giving the
number of test cases in the input. Each test case starts with a line
containg two integers x, y such that 1 <= x,y <= 50. After this, y
lines follow, each which x characters. For each character, a space ``
'' stands for an open space, a hash mark ``#'' stands for an obstructing
wall, the capital letter ``A'' stand for an alien, and the capital
letter ``S'' stands for the start of the search. The perimeter of the
maze is always closed, i.e., there is no way to get out from the
coordinate of the ``S''. At most 100 aliens are present in the maze, and
everyone is reachable.
Output
Sample Input
2
6 5
#####
#A#A##
# # A#
#S ##
#####
7 7
#####
#AAA###
# A#
# S ###
# #
#AAA###
#####
Sample Output
8
11 题意:求输入图中'S'点到所有'A'点的最小距离。
题解:这个题出的很好,要把一幅图转换为另外一幅图,用BFS把每一个点到其余所有的点的距离全部求一遍,然后按照点的下标构造一副新的图。构造完后,用prim算法求最小生成树即可。
这个题的输入处理有点问题。。不能用getchar(),我是参考了别人的代码改成这样才AC
getchar()---------->char temp[51];
gets(temp);
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
const int N = ;
const int INF = ;
char a[N][N];
bool vis[N][N];
int graph[N][N];
int dis[N][N];
int n,m,k;
struct Point
{
int x,y;
} p[N*];
void input(int &k)
{
for(int i=; i<n; i++){
gets(a[i]);
for(int j=; j<m; j++){
if(a[i][j]=='S'){
p[].x = i;
p[].y = j;
}
if(a[i][j]=='A'){
p[k].x =i;
p[k++].y =j;
}
}
}
for(int i=;i<k;i++){
for(int j=;j<k;j++) graph[i][j] = INF;
}
}
void BFS(Point start,int start1){
int dir[][] = {{,},{-,},{,},{,-}};
memset(vis,false,sizeof(vis));
memset(dis,,sizeof(dis));
queue<Point> q;
q.push(start);
vis[start.x][start.y] = true;
while(!q.empty()){
Point t = q.front();
q.pop();
for(int i=;i<;i++){
int x = t.x+dir[i][];
int y = t.y+dir[i][];
if(x<||x>=n||y<||y>=m||vis[x][y]||a[x][y]=='#') continue;
dis[x][y]= dis[t.x][t.y]+;
vis[x][y] = true;
Point p1;
p1.x = x,p1.y = y;
q.push(p1);
}
}
for(int i=;i<k;i++){
graph[start1][i] = dis[p[i].x][p[i].y];
}
return;
}
bool vis1[N*];
int low[N*];
int prim(int n,int pos){
memset(vis1,false,sizeof(vis1));
memset(low,,sizeof(low));
for(int i=;i<n;i++){
low[i] = graph[pos][i];
}
int cost = ;
vis1[pos] = true;
low[pos] = ;
for(int i=;i<n;i++){
int Min = INF;
for(int j=;j<n;j++){
if(!vis1[j]&&Min>low[j]){
pos = j;
Min = low[j];
}
}
cost += Min;
vis1[pos] = true;
for(int j=;j<n;j++){
if(!vis1[j]&&low[j]>graph[pos][j]) low[j] = graph[pos][j];
}
}
return cost;
}
int main()
{
int tcase;
scanf("%d",&tcase);
while(tcase--)
{
scanf("%d%d",&m,&n);
char temp[];
gets(temp);
k=;
input(k);
for(int i=;i<k;i++) BFS(p[i],i);
printf("%d\n",prim(k,));
}
return ;
}
poj 3026(BFS+最小生成树)的更多相关文章
- Borg Maze POJ - 3026 (BFS + 最小生成树)
题意: 求把S和所有的A连贯起来所用的线的最短长度... 这道题..不看discuss我能wa一辈子... 输入有坑... 然后,,,也没什么了...还有注意 一次bfs是可以求当前点到所有点最短距离 ...
- poj 3026 bfs+prim Borg Maze
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9718 Accepted: 3263 Description The B ...
- Borg Maze - poj 3026(BFS + Kruskal 算法)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9821 Accepted: 3283 Description The B ...
- poj 3026 Borg Maze (bfs + 最小生成树)
链接:poj 3026 题意:y行x列的迷宫中,#代表阻隔墙(不可走).空格代表空位(可走).S代表搜索起点(可走),A代表目的地(可走),如今要从S出发,每次可上下左右移动一格到可走的地方.求到达全 ...
- POJ - 3026 Borg Maze BFS加最小生成树
Borg Maze 题意: 题目我一开始一直读不懂.有一个会分身的人,要在一个地图中踩到所有的A,这个人可以在出发地或者A点任意分身,问最少要走几步,这个人可以踩遍地图中所有的A点. 思路: 感觉就算 ...
- 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
id=3026">[POJ 3026]Borg Maze 一个考察队搜索alien 这个考察队能够无限切割 问搜索到全部alien所须要的总步数 即求一个无向图 包括全部的点而且总权值 ...
- 【bzoj4242】水壶 BFS+最小生成树+倍增LCA
题目描述 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入 ...
- (POJ 3026) Borg Maze 最小生成树+bfs
题目链接:http://poj.org/problem?id=3026. Description The Borg is an immensely powerful race of enhanced ...
随机推荐
- netty学习记录1
最近在学习netty,看的是<netty权威指南 第2版>. 然后看的同时也把书上面的代码一行行敲下来做练习,不过到第三章就出问题了. 按照书上讲的,sever/client端都需要继承C ...
- springmvc上传图片并显示--支持多图片上传
实现上传图片功能在Springmvc中很好实现.现在我将会展现完整例子. 开始需要在pom.xml加入几个jar,分别是: <dependency> <groupId>comm ...
- KVO的底层实现原理?如何取消系统默认的KVO并手动触发?
KVO是基于runtime机制实现的 当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类(该类的子类),在这个派生类中重写基类中任何被观察属性的setter 方法.派生类在被 ...
- split array
public boolean splitArray(int[] nums) { return dividSameSumGroup(0,nums, 0,0); } public boolean divi ...
- 《算法》C++代码 前言
现在大二正在上<数据结构>课,课内的书上代码实现很喜欢无脑用类.变量名字很长,而且常常实现太繁琐,并且代码有些无法运行,这些对于老手无所谓,但初学者看起来却会很不舒服.因此写点自己的代码, ...
- android 摄像头相关使用记录
检测闪光灯是否存在 部分手机不存在闪光灯,检测是否存在还是有必要的. boolean hasFlash = this.getPackageManager().hasSystemFeature(Pack ...
- 【Minimum Window】cpp
题目: Given a string S and a string T, find the minimum window in S which will contain all the charact ...
- Java进制间的转换
最近学习了Java间的进制转换,记录下自己的学习心得,希望可以帮到前来查看的朋友们,如果有不懂的地方可以在下方评论留言,我们一起学习进步,只有自己足够强大才能弥补不足,多学习, 任意进制到十进制的转换 ...
- Android 图片文字单位 px、dp、sp区别
文章来源:http://www.cnblogs.com/bjzhanghao/archive/2012/11/06/2757300.html px:像素,一个像素点,1px代表屏幕上一个物理的像素点: ...
- 主流 NoSQL 数据库对比
HBase HBase 是 Apache Hadoop 中的一个子项目,属于 bigtable 的开源版本,所实现的语言为Java(故依赖 Java SDK).HBase 依托于 Hadoop 的 H ...