邻接矩阵80分求助
查看原帖
邻接矩阵80分求助
315873
Xxsr楼主2022/7/28 08:23

rt,80分,WA最后两个点

#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
using namespace std;
const int N=1000+55;
int t,n,h,r,m;
int x[N],y[N],z[N];
int g[N][N],vis[N];
bool check(int a,int b){
	double dis=(double)( (x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])+(z[a]-z[b])*(z[a]-z[b]) );
	if( (double) r*2>=sqrt(dis) ) return 1;
	return 0;
}
inline void init(){
	rep(i,1,n){
		if(z[i]<=r) g[0][i]=g[i][0]=1;//与起点联通 
		if(z[i]+r>=h) g[m][i]=g[i][m]=1;//与终点联通 
	}
	rep(i,1,n) rep(j,1,n)
		if(i!=j && check(i,j) ) g[i][j]=g[j][i]=1;
}
queue<int>q;
bool bfs(){
	while(!q.empty() ) q.pop();//清空队列 
	q.push(0);
	vis[0]=1;
	while(!q.empty()){
		int v=q.front();
		q.pop() ; 
		rep(i,0,m) 
			if(g[v][i]&&!vis[i]){
				if(i==m) return 1;
				vis[i]=1;
				q.push(i);
			}
	}
	return 0;
}
int main(){
	cin>>t;
	while(t--){
		memset(g,0,sizeof(g));
		memset(vis,0,sizeof(vis));
		cin>>n>>h>>r;
		m=n+1;//虚拟终点,编号为m 
		rep(i,1,n) cin>>x[i]>>y[i]>>z[i];
		init();//初始化 
		if(bfs()) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}
2022/7/28 08:23
加载中...