J - Borg Maze - poj 3026(BFS+prim)

在一个迷宫里面需要把一些字母。也就是 ‘A’ 和 ‘B’连接起来,求出来最短的连接方式需要多长,也就是最小生成树,地图需要预处理一下,用BFS先求出来两点间的最短距离,

**********************************************************************************

#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

const int maxn = 105;
const int oo = 0xfffffff;

int  dir[4][2] = { {1,0},{0,1},{-1,0},{0,-1} };
char G[maxn][maxn];          //保存地图
int  D[maxn][maxn];          //记录两点间的距离
int  use[maxn][maxn];        //标记地图
int  Index[maxn][maxn];      //记录‘A’或者‘B’的编号
struct node{int x, y, step;};

void BFS(int k, int M,int N, int x, int y)
{
    queue<node> Q;
    node s;
    s.x = x, s.y = y, s.step = 0;
    use[s.x][s.y] = k; Q.push(s);

while(Q.size())
    {
        s = Q.front();Q.pop();
        if(G[s.x][s.y]>=‘A‘ && G[s.x][s.y] <=‘Z‘)
            D[k][ Index[s.x][s.y] ] = s.step;

for(int i=0; i<4; i++)
        {
            node q = s;
            q.x += dir[i][0], q.y += dir[i][1];

if(q.x>=0&&q.x<M && q.y>=0&&q.y<N && G[q.x][q.y]!=‘#‘ && use[q.x][q.y]!=k)
            {
                use[q.x][q.y] = k;
                q.step += 1;
                Q.push(q);
            }
        }
    }
}
int  Prim(int N)            //这里面的N代表编号最多到N
{
    int i, dist[maxn], vis[maxn]={0, 1};
    int ans = 0, T=N-1;

for(i=1; i<=N; i++)
        dist[i] = D[1][i];

while(T--)
    {
        int k=1, mini = oo;

for(i=1; i<=N; i++)
        {
            if(!vis[i] && mini > dist[i])
                mini = dist[i], k=i;
        }
        ans += mini;
        vis[k] = true;

for(i=1; i<=N; i++)
            if(!vis[i])dist[i] = min(dist[i], D[k][i]);
    }

return ans;
}

int main()
{
    int T;

scanf("%d", &T);

while(T--)
    {
        int i, j, M, N, t=1;

scanf("%d%d ", &N, &M);

for(i=0; i<M; i++)
        {
            gets(G[i]);
            for(j=0; j<N; j++)
            {
                if(G[i][j]>=‘A‘ && G[i][j]<=‘Z‘)
                    Index[i][j] = t++;
                use[i][j] = 0;
            }
        }

for(i=0; i<M; i++)
        for(j=0; j<=N; j++)
        {
            if(G[i][j]>=‘A‘ && G[i][j]<=‘Z‘)
                BFS(Index[i][j], M, N, i, j);
        }

int ans = Prim(t-1);

printf("%d\n", ans);
    }

return 0;
}

时间: 2024-10-31 03:39:44

J - Borg Maze - poj 3026(BFS+prim)的相关文章

POJ 3026(BFS+prim)

http://poj.org/problem?id=3026 题意:任意两个字母可以连线,求把所有字母串联起来和最小. 很明显这就是一个最小生成树,不过这个题有毒.他的输入有问题.在输入m和N后面,可能有一大串的空格.就因为这个,我RE都有点懵了,要不是discuss里面有人说输入有问题,我都没注意到这个,原本只用了一个getchar吃掉最后的换行符.没想到之后还有空格.有点小坑. 思路:这个题目如果他给你一个图,那就是最裸的prim了.不过这个题的难点也就是在他给的图你不能用Prim,你只能通

POJ 2485-Highways(最小生成树prim)

Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22433   Accepted: 10341 Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. So the traffic is difficult in Flatopia. The Fl

Borg Maze - poj 3026(BFS + Kruskal 算法)

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9821   Accepted: 3283 Description The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of the galaxy. The Borg collective is the term used to describe the gr

Borg Maze POJ - 3026

题目链接:https://vjudge.net/problem/POJ-3026 思路: 题目说建立一个通道网络,使得‘S’能到达其他所有'A',且所有通道长度相加最短,可以看出是一个最小生成树,就是建图比较麻烦. 用bfs建图,跑出每个‘S’或‘A’到其他‘S’或‘A’的距离,然后只需要套上最小生成树的板子就OK. 1 #include <iostream> 2 #include <cstring> 3 #include<vector> 4 #include<s

poj3026(bfs+prim)

The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of the galaxy. The Borg collective is the term used to describe the group consciousness of the Borg civilization. Each Borg individual is linked to the collective by

[kuangbin带你飞]专题六 最小生成树 J - Borg Maze

J - Borg Maze 题目链接:https://vjudge.net/contest/66965#problem/J 题目: 博格是一个非常强大的种族,它来自银河系的三角洲象限.博格集体是用来描述博格文明群体意识的术语.每个博格人都通过复杂的子空间网络与集体联系,确保每个成员得到持续的监督和指导. 你的任务是帮助博格(是的,真的)通过开发一个程序,帮助博格估计扫描迷宫的最低成本,以便同化隐藏在迷宫中的外星人,在北部,西部,东部和南部移动脚步.棘手的是,搜索的开始是由100多个人组成的.每当

poj 1724ROADS(bfs和dfs做法)

1 /* 2 dfs比较好想,就是测试数据的问题,导致在遍历边的时候要倒着遍历才过! 3 */ 4 #include<iostream> 5 #include<cstdio> 6 #include<cstring> 7 #include<vector> 8 #include<algorithm> 9 #define Max 0x3f3f3f3f 10 using namespace std; 11 12 struct node{ 13 int D

poj 1258 Agri-Net (最小生成树 prim)

Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39499   Accepted: 16017 Description Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He nee

J - Borg Maze

J - Borg Maze 思路:bfs+最小生成树. #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 110 using namespace std; int fa[MAXN]; struct nond{ int x,y,z; }v[MAXN*MAXN]; struct none{ int