zoukankan      html  css  js  c++  java
  • 连接的管道(最小生成树)

    连接的管道

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1961    Accepted Submission(s): 687

    Problem Description
    老 Jack 有一片农田,以往几年都是靠天吃饭的。但是今年老天格外的不开眼,大旱。所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行灌溉了。当老 Jack 买完所有铺设在每块农田内部的管道的时候,老 Jack 遇到了新的难题,因为每一块农田的地势高度都不同,所以要想将两块农田的管道链接,老 Jack 就需要额外再购进跟这两块农田高度差相等长度的管道。
    现在给出老 Jack农田的数据,你需要告诉老 Jack 在保证所有农田全部可连通灌溉的情况下,最少还需要再购进多长的管道。另外,每块农田都是方形等大的,一块农田只能跟它上下左右四块相邻的农田相连通。
     
    Input
    第一行输入一个数字T(T10),代表输入的样例组数
    输入包含若干组测试数据,处理到文件结束。每组测试数据占若干行,第一行两个正整数 N,M(1N,M1000),代表老 Jack 有N行*M列个农田。接下来 N 行,每行 M 个数字,代表每块农田的高度,农田的高度不会超过100。数字之间用空格分隔。
     
    Output
    对于每组测试数据输出两行:
    第一行输出:"Case #i:"。i代表第i组测试数据。
    第二行输出 1 个正整数,代表老 Jack 额外最少购进管道的长度。
     
    Sample Input
    2 4 3 9 12 4 7 8 56 32 32 43 21 12 12 2 3 34 56 56 12 23 4
     
    Sample Output
    Case #1: 82 Case #2: 74
     

    题解:裸的克鲁斯卡尔,由于只能相邻的连,所以只用给农田赋个编号就好了,然后排序最小生成树;

    刚开始把MAP和Kruth开在栈里溢出了,放在全局就好了,因为全局变量是堆内存,也就是说只要不超过OJ给的最大内存限制,可以开很大的对象,但是栈内存一般只有2M的样子,而且里面还要存一些线程的基本信息和断点信息,所以实际可用的栈内存不到2M2M的话int数组最多开5e5的样子

                                          ---铭鑫学长 2016/4/8 10:45:58

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int MAXN = 1010;
    int disx[2] = {0,-1};
    int disy[2] = {-1,0};
    struct Node{
        int x, y, v;
        friend bool operator < (Node a, Node b){
            return a.v < b.v;
        }
    };
    Node dt[MAXN * MAXN * 2];
    int mp[MAXN][MAXN];
    int hsh[MAXN][MAXN];
    class Map{
        private:
            int N, M;
        public:
            Map(){
                N = 0;
                M = 0;
            }
            Map(int N, int M){
                this->N = N;
                this->M = M;
                int tp = 0;
                for(int i = 1; i <= N; i++){
                    for(int j = 1; j <= M; j++){
                        scanf("%d",&mp[i][j]);
                        hsh[i][j] = ++tp;
                    }
                }
            }
            void getdt(int &tp){
            //    cout << N << " " << M << endl;
                for(int i = 1; i <= N; i++){
                    for(int j = 1; j <= M; j++){
                        for(int k = 0; k < 2; k++){
                            int nx, ny;
                            nx = i + disx[k];
                            ny = j + disy[k];
                            if(nx <= 0 || ny <= 0 || nx > N || ny > M)
                                continue;
                            dt[tp].x = hsh[nx][ny];
                            dt[tp].y = hsh[i][j];
                            dt[tp].v = abs(mp[nx][ny] - mp[i][j]);
                            tp++;
                        }
                    }
                }
            }
    };
    int pre[MAXN * MAXN];
    class Kruth{
        private:
            
        public:
            Kruth(){
                for(int i = 1; i <= MAXN * MAXN; i++){
                    pre[i] = i;
                }
            }
            int find(int r){
                int x = r;
                while(r != pre[r]){
                    r = pre[r];
                }
                int i = x, j;
                while(i != r){
                    j = pre[i];
                    pre[i] = r;
                    i = j;
                }
                return r;
            }
            void merge(int x, int y, int v, int &ans){
                int f1 = find(x), f2 = find(y);
                if(f1 != f2){
                    pre[f1] = f2;
                    ans += v;
                }
            }
    };
    int main(){
        int T;
        int kase = 0;
        cin >> T;
        while(T--){
            int N, M;
            cin >> N >> M;
            Map a(N,M);
            int tp = 0;
            int ans = 0;
            a.getdt(tp);
            sort(dt, dt + tp);
            Kruth kru;
            for(int i = 0; i < tp; i++){
                kru.merge(dt[i].x, dt[i].y, dt[i].v, ans);
            }
            printf("Case #%d:
    %d
    ",++kase,ans);
        }
        return 0;
    }
  • 相关阅读:
    使用java Graphics 绘图工具生成顺丰快递电子面单
    NPM使用命令总结
    MYSQL主从库同步配置过程
    Redis的事务功能详解
    MapReduce 原理与 Python 实践
    Django权限机制的实现
    Python调用外部程序——os.system()和subprocess.call
    oracle11g安装教程(注意事项及图文教程)
    顶级的JavaScript框架、库、工具及其使用
    经典CSS坑:如何完美实现垂直水平居中?
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5367146.html
Copyright © 2011-2022 走看看