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 ...
随机推荐
- [bzoj2932][POI1999]树的染色问题
被百度搜到的题解(论文?)坑了. 写的那玩意好像石乐志... Description 一棵二叉树采用以下规则描述: 1.如果一个节点度数为0,则仅用一个元素“0”来描述它. 2.如果一个节点度数为1, ...
- pg数据库数据表异常挂起
pg数据库即是PostgreSQL数据库. 前几天在一个Java项目中,出现运行Java程序后,pg数据库的数据表异常挂起.而且是在某台电脑上出现的,重装数据库也没用,其它电脑未能复现,是个很奇怪的现 ...
- 程序第一次启动推送跳转,handleOpenURL没法跳转的原因
iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有 ...
- 《Cracking the Coding Interview》——第1章:数组和字符串——题目4
2014-03-18 01:36 题目:给定一个字符串,将其中的空格‘ ’替换为‘%20’,你可以认为字符串尾部有足够空间来容纳新增字符.请不要额外开辟数组完成. 解法:先从前往后统计空格个数,然后从 ...
- 【Binary Tree Right Side View 】cpp
题目: Given a binary tree, imagine yourself standing on the right side of it, return the values of the ...
- iphone 8 plus 红色特别版,突然自动关机无法启动
今天早上我的iphone 8p 突然自己在床上闪动开机图标,闪了半个多小时它就光荣的自动关机了,我尝试了长按开机键,长按home+开机键15秒,通通木有用,它就是没!反!应! 于是找了售后,学到了正确 ...
- sql 表数据转移另一张表
if not exists(select * from syscolumns where id=object_id('REMOTEDETECTION_2018')) begin SELECT * I ...
- ssh-centos74.sh
#!/bin/bash sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config sed -i 's/#Us ...
- 聊聊、Mybatis API
API Mybatis 到底解决了什么问题,持久化框架是什么,没出现 Mybatis 之前我们又是怎么来操作数据库的呢?对于 Java语言 来说,JDBC标准 是比较底层的了,但并非最底层的,可以说 ...
- HDU 4725 The Shortest Path in Nya Graph( 建图 + 最短路 )
主要是建图,建好图之后跑一边dijkstra即可. 一共3N个点,1~N是原图中的点1~N,然后把每层x拆成两个点(N+x)[用于连指向x层的边]和(N+N+x)[用于连从x层指出的边]. 相邻层节点 ...