题目链接: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. 小伙子,你真的清楚 JVM GC ?

    序 正文 如何确定垃圾? 前面已经提到 JVM 可以采用 引用计数法 与 可达性分析算法 来确定需要回收的垃圾,我们来具体看一下这两种算法: 引用计数法 该方法实现为:给每个对象添加一个引用计数器,每 ...

  2. S2:log4j

    配置步骤 1.引入jar,放到lib中,jar包被项目管理 2.在src目录下copy了一个文件log4j.properties 3.使用Logger   String word="会员登记 ...

  3. 恐怖的Hibernate和JavaFX Table CallBack!

    目录 [隐藏] 1 Hibernate 2 JavaFX Table Hibernate 最近在做 JavaFX 应用,不管再怎么避免数据持久化,但面对几十万的数据量的时候也只能乖乖的去配置持久层框架 ...

  4. kali,ubuntu, debain DNS 配置

    kali 是基于 debain 的一个 Linux 发行版 DNS 的配置 是在文件 /etc/resolv.conf  下. 但是,我们会发现 /etc/resolv.conf 每次重启都会失效, ...

  5. ThreadPoolExecutor线程池的一个面试题

    问题:现有一个线程池,参数corePoolSize = 5,maximumPoolSize = 10,BlockingQueue阻塞队列长度为5,此时有4个任务同时进来,问:线程池会创建几条线程? 如 ...

  6. viewpager_轮播

    public class MainActivity extends Activity { private ViewPager pager; private int[] id={R.layout.lay ...

  7. Javascript中的基本数据类型,如何判断数据类型,作用域链的理解

    第一部分:Javascript中的数据类型 javascript中 基本数据类型有 五种, 数字 number 字符串 string  布尔 boolean  未定义 undefined 空值 nul ...

  8. Go-cron定时任务

    1.cron(计划任务) 按照约定的时间,定时的执行特定的任务(job). cron 表达式 表达了这种约定. cron 表达式代表了一个时间集合,使用 6 个空格分隔的字段表示. 秒 分 时 日 月 ...

  9. 纯数据结构Java实现(4/11)(BST)

    个人感觉,BST(二叉查找树)应该是众多常见树的爸爸,而不是弟弟,尽管相比较而言,它比较简单. 二叉树基础 理论定义,代码定义,满,完全等定义 不同于线性结构,树结构用于存储的话,通常操作效率更高.就 ...

  10. random库的使用

    一.random库介绍 random库是使用随机数的Python标准库 伪随机数:采用梅森旋转算法生成的(伪)随机序列中元素 random库主要用于生成随机数 使用random库:import ran ...