题目链接: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)的更多相关文章

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

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

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

    有几个错误,调试了几个小时,样例过后 1Y. 题目:http://poj.org/problem?id=3026 题意:就是让求A们和S的最小生成树 先用bfs找每两点的距离,再建树.没剪枝 63MS ...

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

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

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

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

  5. POJ 3026 --Borg Maze(bfs,最小生成树,英语题意题,卡格式)

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16625   Accepted: 5383 Descri ...

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

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

  7. poj 3026 Borg Maze (BFS + Prim)

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

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

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

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

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

  10. POJ 3026 Borg Maze (最小生成树)

    Borg Maze 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/I Description The Borg is an im ...

随机推荐

  1. Golang版本的rocksdb-对gorocksdb的封装

    rocksdb的优秀特性不用多说,但是它是用c++语言写的,就是这一个特点就把很多人拦住了.虽然rocksdb官方也有Java版本,但是Golang的发展速度让人不容小觑,而且由于golang原生对高 ...

  2. 关于STM32GPIO按键上下拉配置的认识

    说真的,后知后觉这个问题还是有点值得研究的,一开始学习我用的板子在按键模块电路中GPIO输入脚是有外部上下拉电阻的,如下图所示:当KEY1接V3.3,在其后为它接一个下拉电阻,可以保证按下按键输入高电 ...

  3. 云计算网络基础笔记及VLAN交换机配置

  4. 一次简单的SQL手工注入

    1. 首先要了解SQL注入的原理:   SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 具体来说,它是利 ...

  5. L1063 能量项链

    1 #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i = a; i <= b ...

  6. android ——后台下载

    这次的这个demo想要实现一个后台下载文件的功能,下载的时候会有一个告知进度的通知, 使用的依赖库就一个: compile 'com.squareup.okhttp3:okhttp:3.9.0' 大体 ...

  7. 7.17 正则表达式 re模块

    在介绍正则表达式和re模块之前,先简要介绍一下 正则表达式与re模块的关系 1.正则表达式是一门独立的技术,任何语言均可使用 2.python中要想使用正则表达式需要通过re模块 正则表达式 元字符 ...

  8. hadoop2.7之作业提交详解(下)

    接着作业提交详解(上)继续写:在上一篇(hadoop2.7之作业提交详解(上))中已经讲到了YARNRunner.submitJob() [WordCount.main() -> Job.wai ...

  9. TinyMCE使用

    1.文本&文本字体颜色 与word类似不赘述 2.字体加粗&划线 与word类似不赘述 选中后  ctrl + B  加粗快捷键 选中后  ctrl + I  斜体快捷键 选中后  c ...

  10. FILEBEAT+ELK日志收集平台搭建流程

    filebeat+elk日志收集平台搭建流程 1.         整体简介: 模式:单机 平台:Linux - centos - 7 ELK:elasticsearch.logstash.kiban ...