求大佬帮忙查简单并查集,孩子已经调了十几个小时了/kk
查看原帖
求大佬帮忙查简单并查集,孩子已经调了十几个小时了/kk
261262
WaltVBAlston楼主2021/7/25 12:45

题目链接——奶酪

代码:(我的)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
struct node{
	int u,v;
	double w;
}e[10000005];
int x[1000005],y[1000005],z[1000005],fa[100005],num=0;
int t,n,h,r;
double cal(int a,int b){
	return sqrt((long long)((long long)(x[a]-x[b])*(x[a]-x[b])+(long long)(y[a]-y[b])*(y[a]-y[b])+(long long)(z[a]-z[b])*(z[a]-z[b])));
}
int find(int a){
	if(a==fa[a])
		return a;
	return a=fa[a];
} 
int cmp(node a,node b){
	return a.w<b.w;
}
int main(){
	cin>>t;
	while(t--){
		num=0;
		memset(x,0,sizeof(x));
		memset(y,0,sizeof(y));
		memset(z,0,sizeof(z));
		memset(e,0,sizeof(e));
		cin>>n>>h>>r;
		for(int i=0;i<=n;i++)
			fa[i]=i;
		for(int i=1;i<=n;i++)
			cin>>x[i]>>y[i]>>z[i],fa[i]=i;
		fa[n+1]=n+1;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				e[++num].u=i,e[num].v=j,e[num].w=cal(i,j)/2;
		for(int i=1;i<=n;i++){
			e[++num].u=i,e[num].v=0,e[num].w=z[i];
			e[++num].u=0,e[num].v=i,e[num].w=z[i];
			e[++num].u=i,e[num].v=n+1,e[num].w=h-z[i];
			e[++num].u=n+1,e[num].v=i,e[num].w=h-z[i];
		}
		sort(e+1,e+num+1,cmp);
		bool flag=false;
		for(int i=1;i<=num;i++){
			if(e[i].w>r)
				break;
			int a=e[i].u,b=e[i].v;
			if(find(a)!=find(b))
				fa[find(a)]=find(b);
			if(find(0)==find(n+1)){
				flag=true;
				break;
			}
		}
		if(flag==true)
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl;
	}
	return 0;
}

30分,能通过样例。剩下的1个WA,然后全部TLE

hack的一组数据:

(T不给出)

8 5581 3224

-5586 -4382 407

4 -8416 0 4315

840 -3792 142

-7214 -7830 5162

6112 9150 4125

2400 848 1298

-3604 2463 1637

9476 8708 660

答案输出:Yes

我的输出:No

求助!!!!

2021/7/25 12:45
加载中...