1091. Acute Stroke (30)解题报告

来源:互联网 发布:新疆人口普查数据 编辑:程序博客网 时间:2024/06/06 00:42

这实际上是并查集问题。题目要求的输出就是不小于T大小的集合里面含有的所有元素的数量。

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;void setunion(int s[], int i, int j);int findroot(int s[], int i);int main(int argc, char** argv) {int *s, m, n, l, t, i, j, k, tmp, index, cnt;bool *matrix;scanf("%d %d %d %d", &m, &n, &l, &t);s = new int[m * n * l];matrix = new bool[m * n * l];for(i = 0; i < l; i++){for(j = 0; j < m; j++){for(k = 0; k < n; k++){s[i * m * n + j * n + k] = -1;}}}for(i = 0; i < l; i++){for(j = 0; j < m; j++){for(k = 0; k < n; k++){scanf("%d", &tmp);if(tmp){matrix[i * m * n + j * n + k] = true;}else{matrix[i * m * n + j * n + k] = false;}}}}for(i = 0; i < l; i++){for(j = 0; j < m; j++){for(k = 0; k < n; k++){index = i * m * n + j * n + k;if(matrix[index]){if(i - 1 >= 0 && matrix[(i - 1) * m * n + j * n + k]){setunion(s, index, (i - 1) * m * n + j * n + k);}if(j - 1 >= 0 && matrix[i * m * n + (j - 1) * n + k]){setunion(s, index, i * m * n + (j - 1) * n + k);}if(k - 1 >= 0 && matrix[i * m * n + j * n + k - 1]){setunion(s, index, i * m * n + j * n + k - 1);}}}}}cnt = 0;for(i = 0; i < l; i++){for(j = 0; j < m; j++){for(k = 0; k < n; k++){index = i * m * n + j * n + k;if(matrix[index] && s[index] < 0 && -s[index] >= t){cnt += (-s[index]);}}}}printf("%d", cnt);delete[] s;delete[] matrix;return 0;}void setunion(int s[], int i, int j){int root1, root2;root1 = findroot(s, i);root2 = findroot(s, j);if(root1 == root2){return;}if(s[root1] < s[root2]){s[root1] += s[root2];s[root2] = root1;}else{s[root2] += s[root1];s[root1] = root2;}return;}int findroot(int s[], int i){if(s[i] < 0){return i;}else{return s[i] = findroot(s, s[i]);}}

0 0