您的位置:首页 > 其它

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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息