【解题报告】 【NOIP2017】 奶酪

【NOIP2017】 奶酪

题目:奶酪

解题思路:

同样的,可以用dfs做,但是有没有发现,用并查集做会更加地,简单?

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100005;
int f[1005];
void init(int n)
{
	for(int i=1;i<=n;i++)
	f[i]=i;
}
int get(int x)
{
	return f[x]=(x==f[x]?x:get(f[x]));
}
void merge(int x,int y)
{
	f[get(x)]=get(y);
}
long long dis(long long x,long long y,long long z,long long x1,long long y1,long long z1)
{
    return (x-x1)*(x-x1)+(y-y1)*(y-y1)+(z-z1)*(z-z1);
}
long long x[maxn],y[maxn],z[maxn];
int f1[maxn],f2[maxn];
int t;
int n,h;
long long r;
int main()
{
	cin>>t;
	for(int i=1;i<=t;i++)
	{
		cin>>n>>h>>r;
		int t1=0,t2=0;
		init(n);
		for(int j=1;j<=n;j++)
		{
			cin>>x[j]>>y[j]>>z[j];
			if(z[j]+r>=h)
			{
				t1++;
				f1[t1]=j;
			}
			if(z[j]-r<=0)
			{
				t2++;
				f2[t2]=j;
			}
			for(int k=1;k<=j;k++)
			{
				if((x[j]-x[k])*(x[j]-x[k])+(y[j]-y[k])*(y[j]-y[k])>4*r*r)
				continue;
				if(dis(x[j],y[j],z[j],x[k],y[k],z[k])<=4*r*r)
				{
					int a1=get(j);
					int a2=get(k);
					if(a1!=a2)
					f[a1]=a2;
				}
			}
		}
		int s=0;
		for(int j=1;j<=t1;j++)
		{
			for(int k=1;k<=t2;k++)
			{
				if(get(f1[j])==get(f2[k]))
				{
					s=1;
					break;
				}
			}
			if(s==1)
			break;
		}
		if(s==1)
		cout<<"Yes"<<endl;
		else
		cout<<"No"<<endl; 
	}
	return 0;
}
原文地址:https://www.cnblogs.com/wweiyi2004/p/11483865.html