题目链接:http://poj.org/problem?id=3026
题意:题意就是从起点开始可以分成多组总权值就是各组经过的路程,每次到达一个‘A'点可以继续分组,但是在路上不能分组
于是就是明显的最小生成树,点与点的距离要用bfs或者dfs求一下。这题bfs要稍微优化一下。不能下暴力的bfs就是两点两点之间
bfs这样会有很多重复的查询会超时,所以要一次性的bfs找到一个点就bfs到底。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
int x , y , num , pos[200][200] , cost[200][200] , f[200] , dr[4][2] = {0 , 1 , 0 , -1 , 1 , 0 , -1 , 0};
char s[60][60] , cp[10];
void init() {
for(int i = 0 ; i <= num ; i++) {
f[i] = i;
}
}
int find(int x) {
if(x == f[x])
return x;
int tmp = find(f[x]);
return f[x] = tmp;
}
struct TnT {
int x , y , step;
};
struct node {
int x , y , val;
}nodes[40000];
bool cmp(node a , node b) {
return a.val < b.val;
}
bool vis[110][110] , have[110][110];
void bfs(int xx , int yy) {
memset(vis , false , sizeof(vis));
queue<TnT>q;
vis[xx][yy] = true;
TnT gg , gl;
gg.x = xx , gg.y = yy , gg.step = 0;
q.push(gg);
while(!q.empty()) {
gg = q.front();
q.pop();
if(pos[gg.x][gg.y] != -1) {
cost[pos[xx][yy]][pos[gg.x][gg.y]] = gg.step;
}
for(int i = 0 ; i < 4 ; i++) {
gl.x = gg.x + dr[i][0];
gl.y = gg.y + dr[i][1];
gl.step = gg.step + 1;
if(gl.x >= 0 && gl.x < y && gl.y >= 0 && gl.y < x && s[gl.x][gl.y] != '#' && !vis[gl.x][gl.y]) {
vis[gl.x][gl.y] = true;
q.push(gl);
}
}
}
}
int main() {
int t;
scanf("%d" , &t);
while(t--) {
scanf("%d%d" , &x , &y);
gets(cp);
for(int i = 0 ; i < y ; i++) {
for(int j = 0 ; j < x ; j++) {
pos[i][j] = -1;
cost[i][j] = -1;
}
}
num = 0;
for(int i = 0 ; i < y ; i++) {
gets(s[i]);
for(int j = 0 ; j < x ; j++) {
if(s[i][j] == 'A' || s[i][j] == 'S') {
pos[i][j] = num++;
}
}
}
for(int i = 0 ; i < y ; i++) {
for(int j = 0 ; j < x ; j++) {
if(s[i][j] == 'A' || s[i][j] == 'S') {
bfs(i , j);
}
}
}
init();
int count = 0;
for(int i = 0 ; i < num ; i++) {
for(int j = i + 1 ; j < num ; j++) {
if(cost[i][j] != -1) {
nodes[count].x = i , nodes[count].y = j , nodes[count].val = cost[i][j];
count++;
}
}
}
sort(nodes , nodes + count , cmp);
int sum = 0 , temp = 0;
for(int i = 0 ; i < count ; i++) {
int a = find(nodes[i].x) , b = find(nodes[i].y);
if(a != b) {
f[a] = b;
sum += nodes[i].val;
temp++;
}
if(temp == num - 1)
break;
}
printf("%d\n" , sum);
}
return 0;
}
poj 3026 Borg Maze(最小生成树+bfs)的更多相关文章
-
快速切题 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)
有几个错误,调试了几个小时,样例过后 1Y. 题目:http://poj.org/problem?id=3026 题意:就是让求A们和S的最小生成树 先用bfs找每两点的距离,再建树.没剪枝 63MS ...
-
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+最小生成树)
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 ...
-
poj 3026 Borg Maze 最小生成树 + 广搜
点击打开链接 Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7097 Accepted: 2389 ...
-
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 (最小生成树)
Borg Maze 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/I Description The Borg is an im ...
随机推荐
-
js之oop <;六>;数组的crud(增删改)
增 Create: push(); 向数组尾添加元素 var arr = [2,6,8,7,4]; arr.push(100); console.log(arr); //输出 [2,6,8,7,4,1 ...
-
ssh免密登录
背景:搭建Hadoop环境需要设置无密码登陆,所谓无密码登陆其实是指通过证书认证的方式登陆,使用一种被称为"公私钥"认证的方式来进行ssh登录. 在linux系统中,ssh是远程登 ...
-
【转】POP3、SMTP和IMAP之间的区别和联系
POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议.它是因特网电子邮件的第 ...
-
获取IP城市
新浪的接口 : http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 多地域测试方法:http://int.dpool.sina. ...
-
使用 HTML5 设计辅助功能
使用 HTML5 设计辅助功能 Rajesh Lal 下载代码示例 如果您真的对面向广大受众感兴趣,将需要为网站设计辅助功能. 辅助功能使网页更易于访问.更易于使用,可供每个人浏览. 通常,使用最新的 ...
-
难得一见的HTML5动画欣赏及源码下载
今天要给大家分享一些很酷的HTML5动画演示,并且提供源代码的下载.大部分HTML5动画都是通过canvas实现,当然也有基于SVG的,尤其是第一个,看起来很简单,但是创意却不错. 1.HTML5梦幻 ...
-
Hadoop HA部署
因为公司旧系统的Hadoop版本是2.2,所以在部署新系统时使用了旧系统. 但是在部署ResourceManager auto failover时发现其他nodemanager总是向0.0.0.0请求 ...
-
impress.js初体验
概述 如果你已经厌烦了使用PowerPoint制作PPT,那么impress.js是一个非常好的选择,用它做的PPT更加直观,效果也非常的不错.装X是需要一定代价的,不过如果你是个前端爱好者那么一切就 ...
-
简单尝试Spring Cloud Gateway
简单尝试Spring Cloud Gateway 简介 Spring Cloud Gateway是一个API网关,它是用于代替Zuul而出现的.Spring Cloud Gateway构建于Sprin ...
-
mysql事件调用存储过程总结
第一次写事件调用存储过程,在网上找了一些资料,特此做下总结,巩固一下: 事件调用存储过程主要有三种: (1)创建事件马上执行,调用存储过程 CREATE EVENT if not exists Eve ...