并查集,30分,求助
查看原帖
并查集,30分,求助
215915
Caim_Astraea楼主2021/10/4 14:19

RT,RT,快疯了

#include<bits/stdc++.h>
using namespace std;

int t,n,h,r,x[10005],y[10005],z[10005],father[10005];

inline int read()
{
	char ch=getchar();int x=0,f=1;
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}

void init()
{
	for(int i=0;i<=n+1;i++)
	{
		father[i]=i;
	}
}

int find(int a)
{
	if(father[a]==a)
	{
		return a;
	}
	else
	{
		father[a]=find(father[a]);
		return father[a];
	}
}

void Union(int a,int b)
{
	if(find(a)!=find(b))
	{
		father[find(a)]=find(b);
	}
}

bool pd1(int a,int b)
{
	if(find(a)!=find(b))
	return ((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])+(z[a]-z[b])*(z[a]-z[b])<4*r*r)?true:false;
	return false;
}

bool pd2(int a,int b)
{
	if(find(a)!=find(b))
	{
		if(b==0)
		return (abs(z[a])<=r)?true:false;
		if(b==n+1)
		return (z[a]+r>=h)?true:false;
	}
	return false;
}

int main()
{
	t=read();
	for(int i=1;i<=t;i++)
	{
		n=read();h=read();r=read();
		init();
		for(int j=1;j<=n;j++)
		{
			x[j]=read();y[j]=read();z[j]=read();
			for(int k=0;k<=n+1;k++)
			{
				if(j!=k&&pd1(j,k)&&k!=0&&k!=n+1)
				{
					Union(j,k);
				}
				if((k==0||k==n+1)&&pd2(j,k))
				{
					Union(j,k);
				}
			}
		}
		if(find(0)==find(n+1))
		{
			cout<<"Yes"<<endl;
		}
		else
		{
			cout<<"No"<<endl;
		}
	}
	return 0;	
}
2021/10/4 14:19
加载中...