POJ 3206 Borg Maze:BFS+Prim

Borg Maze:http://poj.org/problem?id=3026

大意:给你一个m*n的迷宫,可以上下左右的走,只能走空格或字母,求出将所有字母连通起来的最小耗费。

思路:先用BFS求出S到所有A的距离,再用Prim求最小生成树,求出最小耗费。这个题坑的不在题,是数据太坑了,在空格处理上没弄好,贡献了好几个WA和CE,看Discuss才知道很坑,最后用G++过了的代码,C++还RE,实在不知道说什么好了  =。=

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

#include <stdio.h>
#include <iostream>
#include <string.h>
#define INF 0xfffffff
using namespace std;

char str[55][55];
int Map[55][55];
int dis[55];
int dist[105][105];
int edge[105][105];
int num, n, m, p    ;

int Move[4][2] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};

int min(int a, int b)
{
    return a > b ? b : a;
}

void BFS(int i, int j)
{
    int head = 0, tail = 0;
    int q_x[2550], q_y[2550];
    bool vis[55][55];
    memset(vis, false, sizeof(vis));
    memset(dist, 0, sizeof(dist));
    vis[i][j] = true;
    q_x[tail] = i;
    q_y[tail++] = j;
    while(head < tail)
    {
        int x = q_x[head];
        int y = q_y[head++];
        if(Map[x][y])
        {
            edge[Map[i][j]][Map[x][y]] = dist[x][y];
        }
        for(int t = 0; t < 4; t++)
        {
            int dx = x+Move[t][0];
            int dy = y+Move[t][1];
            if(dx >= 1 && dx <= m && dy >= 1 && dy <= n)
            {
                if(!vis[dx][dy] && str[dx][dy] != '#')
                {
                    q_x[tail] = dx;
                    q_y[tail++] = dy;
                    vis[dx][dy] = true;
                    dist[dx][dy] = dist[x][y]+1;
                }
            }
        }
    }
}

int Prim()
{
    int Ans;
    int Min_ele, Min_node;
    for(int i = 1; i <= num; i++)
    {
        dis[i] = INF;
    }
    Ans = 0;
    int r = 1;
    for(int i = 1; i <= num-1; i++)
    {
        Min_ele = INF;
        dis[r] = -1;
        for(int j = 1; j <= num; j++)
        {
            if(dis[j] >= 0)
            {
                dis[j] = min(dis[j], edge[r][j]);
                if(dis[j] < Min_ele)
                {
                    Min_ele = dis[j];
                    Min_node = j;
                }
            }
        }
        r = Min_node;
        Ans += Min_ele;
    }
    return Ans;
}

void Solve()
{
    int i, j;
    cin >> p;
    while(p--)
    {
        memset(Map, 0, sizeof(Map));
        num = 0;
        cin >> n >> m;
        char s[100];
        gets(s);///这里太坑了
        for(int i = 1; i <= m; i++)
        {
            gets(str[i]);
            for(int j = 0; j < n; j++)
            {
                if(str[i][j] == 'A' || str[i][j] == 'S')
                {
                    Map[i][j] = ++num;
                }
            }
        }
        for(int i = 1; i <= m; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                if(Map[i][j])
                {
                    BFS(i, j);
                }
            }
        }
        printf("%d\n", Prim());
    }
}

int main()
{
    Solve();

    return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, include
, 队列 bfs 迷宫
, c++ poj
, head
, 空格
, c++ 编程 poj
, tail
最小
133 3206 3878、borgwarner、borgwarner 博格华纳、25l3206e、borg望远镜,以便于您获取更多的相关知识。

时间: 2024-08-03 06:48:22

POJ 3206 Borg Maze:BFS+Prim的相关文章

poj 3206 Borg Maze MST

    很无聊的题目,先bfs求下最短,再prim,输入还有多余空格--懒得敲了,随便找了个代码. 以下代码从http://hi.baidu.com/00gfzs/item/6dd7bf221b955c404799624a转载 #include <iostream> #include <queue> #include <cstring> #include <cstdio> using namespace std; int Val[102]; //prim记录

POJ 1789 Truck History:最小生成树 Prim

Truck History:http://poj.org/problem?id=1789 大意:用一个7位的string代表一个编号,两个编号之间的距离代表这两个编号之间不同字母的个数.一个编号只能由另一个编号变化的来,变化的字母的数量就是这两个编号之间相应的距离,现在要找出一个变化方案,使得总代价最小,也就是距离之和最小. 思路:将每个字符串当成一个节点,求出每个节点之间需要变化的次数为边的权值,用Prim建立最小生成树(稠密图). 更多精彩内容:http://www.bianceng.cnh

POJ 2485 Highways:最小生成树 Prim

Highways:http://poj.org/problem?id=2485 大意:给你一个用邻接矩阵形式存储的有n个顶点的无向图,让你求它的最小生成树并求出在这个生成树里面最大的边的权值. 思路:用Prim求,判断条件改一下就行. PS:dis数组初始化的时候用memset一直RE,希望有知道怎么回事的不吝赐教,谢了~ 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/ #include <stdio.h

【UVA 10307 Killing Aliens in Borg Maze】最小生成树, kruscal, bfs

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20846 POJ 3026是同样的题,但是内存要求比较严格,并是没有过... 对以迷宫形式给定的一些点求最小生成树,不过这里的边并不是抽象的两点间笛卡尔距离,也不是折线距离(迷宫中有障碍),而是需要用四个方向的搜索来求. 用bfs求出任两点间的最短距离后,可用kruscal求出最小生成树. 这次值得一提的是对并查集的一点改造:由于每个顶点由一组(x,y)坐标唯一确定

POJ 1258 Agri-Net:最小生成树 Prim 模版题

Agri-Net:http://poj.org/problem?id=1258 大意:新镇长竞选宣言就是将网络带到每一个农场,给出农场个数,两两之间建光缆的耗费,求所有都联通的最小耗费. 思路:最小生成树,因为边比较稠密,用Prim做. PS:对于比较稠密的图,用Prim,对于比较稀疏的图,用 Kruskal.Kruskal是找边的过程,稀疏的话会比较快. 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

poj 3522 Slim Span:枚举+最小生成树

链接: http://poj.org/problem?id=3522 题目: Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4962   Accepted: 2587 Description Given an undirected weighted graph G, you should find one of spanning trees specified as follows. The grap

poj 1639 Picnic Planning:最小度限制生成树

链接: http://poj.org/problem?id=1639 题目: Picnic Planning Time Limit: 5000MS     Memory Limit: 10000K Total Submissions: 7780     Accepted: 2726 Description The Contortion Brothers are a famous set of circus clowns, known worldwide for their incredible

poj 3164 Command Network:最小树形图模板题

链接: http://poj.org/problem?id=3164 题目: Command Network Time Limit: 1000MS     Memory Limit: 131072K Total Submissions: 8922     Accepted: 2609 Description After a long lasting war on words, a war on arms finally breaks out between littleken's and Knu

POJ 1860 Currency Exchange:最短路 Bellman-Ford

Currency Exchange:http://poj.org/problem?id=1860 大意:有多种货币,之间可以交换,但是需要手续费,也就是说既有汇率又有手续费.问经过交换之后能不能赚. 思路:Bellman_Ford,因为要求最长路,所以松弛条件改一下就好了. Tips: 3              2                  1                20.0货币的数量   兑换点的数量     主人公拥有的货币量    主人公拥有货币的价值1 2 1.00