HDU 5253 连接的管道 —— 并查集
2015-06-02 23:03
363 查看
#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) { parent = findParent(parent ); } return parent ; } 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()); } }