zoukankan      html  css  js  c++  java
  • hdu 5253 最小生成树

    赤裸裸最小生成树,没啥说的,我用kruskal过的

    /*
     * Author    : ben
     */
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <set>
    #include <map>
    #include <stack>
    #include <string>
    #include <vector>
    #include <deque>
    #include <list>
    #include <functional>
    #include <numeric>
    #include <cctype>
    using namespace std;
    /*
     * 输入非负整数
     * 支持short、int、long、long long等类型(修改typec即可)。
     * 用法typec a = get_int();返回-1表示输入结束
     */
    typedef int typec;
    typec get_int() {
        typec res = 0, ch;
        while (!((ch = getchar()) >= '0' && ch <= '9')) {
            if (ch == EOF)
                return -1;
        }
        res = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9')
            res = res * 10 + (ch - '0');
        return res;
    }
    //输入整数(包括负整数,故不能通过返回值判断是否输入到EOF,本函数当输入到EOF时,返回-1),用法int a = get_int2();
    int get_int2() {
        int res = 0, ch, flag = 0;
        while (!((ch = getchar()) >= '0' && ch <= '9')) {
            if (ch == '-')
                flag = 1;
            if (ch == EOF)
                return -1;
        }
        res = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9')
            res = res * 10 + (ch - '0');
        if (flag == 1)
            res = -res;
        return res;
    }
    
    
    const int MAXM = 2000000;
    const int MAXN = 3000000;
    typedef struct {
        int s, e;
        typec len;
    } MyEdge;
    int myset[MAXM], myheight[MAXM];
    MyEdge edges[MAXN];
    int N, M;
    inline bool operator<(const MyEdge &e1, const MyEdge &e2) {
        return e1.len < e2.len;
    }
    void initset() {
        for (int i = 0; i <= M; i++) {
            myset[i] = i;
            myheight[i] = 1;
        }
    }
    int myfind(int x) {
        while (myset[x] != x) {
            x = myset[x];
        }
        return x;
    }
    void mymerge(int a, int b) {
        if (myheight[a] == myheight[b]) {
            myheight[a]++;
            myset[b] = a;
        } else if (myheight[a] < myheight[b]) {
            myset[a] = b;
        } else {
            myset[b] = a;
        }
    }
    
    int kruskal() {
        int ret = 0, x, y, z;
        sort(edges, edges + N);
        initset();
        for (int i = 0; i < N; i++) {
            x = edges[i].s;
            y = edges[i].e;
            z = edges[i].len;
            if (myfind(x) == myfind(y)) {
                continue;
            }
            mymerge(myfind(x), myfind(y));
            ret += z;
        }
        return ret;
    }
    
    int graph[1010][1010];
    
    void buildgraph() {
        int nn = get_int(), mm = get_int();
        for (int i = 0; i < nn; i++) {
            for (int j = 0; j < mm; j++) {
                graph[i][j] = get_int();
            }
        }
        M = nn * mm;
        N = 0;
        for (int i = 0; i < nn - 1; i++) {
            for (int j = 0; j < mm - 1; j++) {
                edges[N].s = i * mm + j;
                edges[N].e = i * mm + j + 1;
                edges[N].len = abs(graph[i][j] - graph[i][j + 1]);
                N++;
                edges[N].s = i * mm + j;
                edges[N].e = i * mm + mm + j;
                edges[N].len = abs(graph[i][j] - graph[i + 1][j]);
                N++;
            }
            edges[N].s = i * mm + mm - 1;
            edges[N].e = i * mm + mm + mm - 1;
            edges[N].len = abs(graph[i][mm - 1] - graph[i + 1][mm - 1]);
            N++;
        }
        for (int j = 0; j < mm - 1; j++) {
            edges[N].s = (nn - 1) * mm + j;
            edges[N].e = (nn - 1) * mm + j + 1;
            edges[N].len = abs(graph[nn - 1][j] - graph[nn - 1][j + 1]);
            N++;
        }
    //    printf("N = %d, M = %d
    ", N, M);
    }
    
    int main() {
    //    freopen("test.in.txt", "r", stdin);
        int T = get_int();
        for (int t = 1; t <= T; t++) {
            buildgraph();
            printf("Case #%d:
    %d
    ", t, kruskal());
        }
        return 0;
    }
  • 相关阅读:
    Go语言从入门到放弃(结构体常见的tag)
    Go语言从入门到放弃(设置 go get 为国内源)
    AndroidStuidio安装
    ADB常用命令
    win10安装Nodejs
    VsCode配置Go语言插件
    Visual Studio Code使用指南
    Go语言从入门到放弃(四)
    CentOs7.5安装Redis
    InnoDB INFORMATION_SCHEMA FULLTEXT Index Tables
  • 原文地址:https://www.cnblogs.com/moonbay/p/4542493.html
Copyright © 2011-2022 走看看