您的位置:首页 > 其它

1091. Acute Stroke (30)解题报告

2016-12-28 15:41 363 查看
这实际上是并查集问题。题目要求的输出就是不小于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]);
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: