L3-004 肿瘤诊断


三维连通块并查集
Guilty Prince用并查集做的升级版
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <stdlib.h>
#define ll long long
const int maxn=60*1286*128+5;
const int INF=0x3f3f3f;
using namespace std;
int parent[maxn],v[maxn];//v用来存储体积
int vis[60][1286][128];
int cnt;
int find(int x)
{
if(parent[x]!=x)
return parent[x]=find(parent[x]);
return parent[x];
}
void merge(int a,int b)
{
int fa=find(a);
int fb=find(b);
if(fa!=fb)
{
if(v[fa]>=v[fb])//合并的时候把体积小的加到体积大的那部分去
{
parent[fb]=fa;
v[fa]+=v[fb];
v[fb]=0;
}else
{
parent[fa]=fb;
v[fb]+=v[fa];
v[fa]=0;
}
}
}
int main()
{
int m,n,l,t,x;
scanf("%d%d%d%d",&m,&n,&l,&t);
memset(vis,0,sizeof(vis));
for(int i=0;i<l;i++)
{
for(int j=0;j<m;j++)
{
for(int k=0;k<n;k++)
{
scanf("%d",&x);
if(x)
vis[i][j][k]=++cnt;
}
}
}
for(int i=0;i<cnt+5;i++)//初始化
{
parent[i]=i;
v[i]=1;
}
for(int i=0;i<l;i++)
for(int j=0;j<m;j++)
for(int k=0;k<n;k++)
{
if(vis[i][j][k])
{
if(i-1>=0&&vis[i-1][j][k])
merge(vis[i][j][k],vis[i-1][j][k]);
if(i+1<l&&vis[i+1][j][k])
merge(vis[i][j][k],vis[i+1][j][k]);
if(j-1>=0&&vis[i][j-1][k])
merge(vis[i][j][k],vis[i][j-1][k]);
if(j+1<m&&vis[i][j+1][k])
merge(vis[i][j][k],vis[i][j+1][k]);
if(k-1>=0&&vis[i][j][k-1])
merge(vis[i][j][k],vis[i][j][k-1]);
if(k+1<n&&vis[i][j][k+1])
merge(vis[i][j][k],vis[i][j][k+1]);
}
}
int sum=0;
for(int i=1;i<=cnt;i++)
if(v[i]>=t)
sum+=v[i];
printf("%d\n",sum);
return 0;
}
三维BFS
看数据那么大,如果用dfs可能会爆栈,果然,dfs是会出现段错误的,可能压栈压多了溢出了
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <queue>
#include <stdlib.h>
#define ll long long
const int maxn=60*1286*128+5;
const int INF=0x3f3f3f;
using namespace std;
int vis[60][1286][128];
int a[60][1286][128];
int m,n,l,t;
int dx[]={1,0,0,-1,0,0};
int dy[]={0,1,0,0,-1,0};
int dz[]={0,0,1,0,0,-1};
struct node{
int a,b,c;
};
bool ok(int x,int y,int z)
{
if(x<0||x>=l||y<0||y>=m||z<0||z>=n)
return false;
else if(a[x][y][z]==0||vis[x][y][z]==1)
return false;
return true;
}
int bfs(int x,int y,int z)
{
node temp;
temp.a=x,temp.b=y,temp.c=z;
queue<node> q;
q.push(temp);
vis[x][y][z]=1;
int v=0;
while(!q.empty())
{
v++;
node f=q.front();
q.pop();
for(int i=0;i<6;i++)
{
int nx,ny,nz;
nx=f.a+dx[i];
ny=f.b+dy[i];
nz=f.c+dz[i];
if(ok(nx,ny,nz))
{
vis[nx][ny][nz]=1;
temp.a=nx,temp.b=ny,temp.c=nz;
q.push(temp);
}
}
}
if(v>=t)
return v;
else
return 0;
}
int main()
{
int x;
scanf("%d%d%d%d",&m,&n,&l,&t);
memset(vis,0,sizeof(vis));
for(int i=0;i<l;i++)
{
for(int j=0;j<m;j++)
{
for(int k=0;k<n;k++)
{
scanf("%d",&a[i][j][k]);
}
}
}
int sum=0;
for(int i=0;i<l;i++)
for(int j=0;j<m;j++)
for(int k=0;k<n;k++)
{
if(a[i][j][k]==1&&vis[i][j][k]==0)
sum+=bfs(i,j,k);
}
printf("%d\n",sum);
return 0;
}
4489

被折叠的 条评论
为什么被折叠?



