zoukankan      html  css  js  c++  java
  • poj 3026 Borg Maze(最小生成树+bfs)

    题目链接: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
    " , sum);
        }
        return 0;
    }
    
  • 相关阅读:
    【HDOJ】4370 0 or 1
    【HDOJ】4122 Alice's mooncake shop
    【HDOJ】4393 Throw nails
    【HDOJ】2385 Stock
    WinCE 输入法编程
    WinCE 自由拼音输入法的测试
    SQL Server CE开发环境建立过程
    【SQL Server CE2.0】创建加密的数据库(源代码)
    【SQL Server CE2.0】打开加密的数据库(源代码)
    EVC在双核PC上调试速度慢的原因
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6634821.html
Copyright © 2011-2022 走看看