求距离想办法用了ULL,double都没办法.甚至#9本地跑是Yes,在洛谷跑是No,求调
#include<bits/stdc++.h>
#include<string>
using namespace std;
unsigned N,head[10000],num;
bool vis,vis_g[10000];
struct edge
{
int to,next;
}e[10000000];
void ADED(int number,int fa,int ch)
{
e[number].to = ch;
e[number].next = head[fa];
head[fa] = number;
}
double dir(int x1,int y1,int z1,int x2,int y2,int z2)
{
return sqrt(abs((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)));
}
void DFS(int x,int hi)
{
if(x >= hi+1 || vis)
{
vis = true;
return;
}
for(int i = head[x]; i ; i = e[i].next)
{
if(!vis_g[e[i].to])
{
//cout<<"DFS:"<<e[i].to<<endl;
vis_g[e[i].to] = true;
DFS(e[i].to,hi);
}
}
}
int main()
{
cin>>N;
for(int i = 0 ; i < N ; i++)
{
memset(head,0,sizeof(int)*10000);
memset(vis_g,false,sizeof(bool)*10000);
num = 0;vis = false;
int n,h;
double r;
cin>>n>>h>>r;
int x[1005],y[1005],z[1005];
for(int j = 1 ; j <= n ; j++)
{
cin>>x[j]>>y[j]>>z[j];
if(z[j] <= r)
{
num++;
ADED(num,0,j);
//cout<<"link:"<<0<<"->"<<j<<endl;
}
if(h-z[j]<=r)
{
num++;
ADED(num,j,n+1);
//cout<<"link:"<<j<<"->"<<n+1<<endl;
}
for(int k = 1 ; k<j;k++)
{
//cout<<dir(x[k],y[k],z[k],x[j],y[j],z[j])<<"&"<<2.00*r<<endl;
if(dir(x[k],y[k],z[k],x[j],y[j],z[j]) <= 2.00*r)
{
num++;
ADED(num,k,j);
//cout<<"link:"<<k<<"->"<<j<<endl;
num++;
ADED(num,j,k);
}
}
}
DFS(0,n);
if(vis)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
}