HDU 5253 连接的管道 —— 并查集

来源:互联网 发布:徐老师淘宝店地址链接 编辑:程序博客网 时间:2024/05/18 20:11
#include <stdio.h>#include <vector>#include <iostream>using namespace std;int a[1005][1005];int node[2000005][2];int parent[1000005];vector<int> ves[105];int abs(int a) {    return a > 0 ? a : -a;}void assort(int n, int m) {    int st = 0;    for (int i = 0; i < n; ++i) {        for (int j = 0; j < m; ++j) {            int l = i * m + j;            if (i > 0) {                ves[abs(a[i][j] - a[i - 1][j])].push_back(st);                node[st][0] = l;                node[st++][1] = l - m;            }            if (j > 0) {                ves[abs(a[i][j] - a[i][j - 1])].push_back(st);                node[st][0] = l;                node[st++][1] = l - 1;            }        }    }}int findParent(int n) {    if (parent[n] != n) {        parent[n] = findParent(parent[n]);    }    return parent[n];}int solve(int n, int m) {    int res = 0, size = n * m;    for (int i = 0; i < size; ++i) {        parent[i] = i;    }    for (int i = 0; i < 100; ++i) {        for (vector<int>::iterator it = ves[i].begin(); it != ves[i].end(); ++it) {            int l = node[*it][0], r = node[*it][1];            parent[l] = findParent(parent[l]);            parent[r] = findParent(parent[r]);            if (parent[l] != parent[r]) {                res += i;            }            if (parent[l] < parent[r]) {                parent[parent[r]] = parent[l];            } else {                parent[parent[l]] = parent[r];            }        }    }    return res;}int dowork() {    int n, m;    scanf("%d%d", &n, &m);    for (int i = 0; i < n; ++i) {        for (int j = 0; j < m; ++j) {            scanf("%d", &a[i][j]);        }    }    for (int i = 0; i < 100; ++i) {        ves[i].clear();    }    assort(n, m);    return solve(n, m);}int main() {    int cas;    scanf("%d", &cas);    for (int i = 1; i <= cas; ++i) {        printf("Case #%d:\n%d\n", i, dowork());    }}

0 0
原创粉丝点击