萌新求助dfs搜图60pts
查看原帖
萌新求助dfs搜图60pts
601747
xibaohe楼主2023/8/6 18:58

WA on #6#7#8#9

#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int T;
bool flag=false;
int n,h,r;
struct node
{
	double x,y,z;
};node no[1005];
vector<int> g[1005];
bool vis[1005];
void dfs(int x)
{
	if(no[x].z+r>=h)
	{
		flag=true;
		return;
	}
	if(flag==true) return;
	if(vis[x]==true) return;
	vis[x]=true;
	for(int i=0;i<g[x].size();i++)
	{
		if(!vis[i]) dfs(g[x][i]);
	}
}
double dist(node a, node b)
{
	return sqrt((a.x - b.x) * (a.x - b.x) + 
	(a.y - b.y) * (a.y - b.y) + 
	(a.z - b.z) * (a.z - b.z));
}
int main(){
	cin>>T;
	while(T--)
	{
		cin>>n>>h>>r;
		for(int i=1;i<=n;i++)
		{
			cin>>no[i].x>>no[i].y>>no[i].z;
		}
		for(int i=1;i<=n;i++) g[i].clear();
		for(int i=1;i<=n;i++)
			for(int j=i+1;j<=n;j++)
			{
				double k=dist(no[i],no[j]);
				if(k<=2*r) 
				{
					g[i].push_back(j);
					g[j].push_back(i);
				}
			}
		flag=false;
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=n;i++)
			if(no[i].z<=r)
				dfs(i);
		if(flag) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}

但是换成邻接矩阵就能AC:

#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int T;
bool flag=false;
int n,h,r;
struct node
{
	double x,y,z;
};node no[1005];
bool g[1005][1005];
bool vis[1005];
void dfs(int x)
{
	if(vis[x]==true) return;
	if(no[x].z+r>=h)
	{
		flag=true;
		return;
	}
	vis[x]=true;
	for(int i=1;i<=n;i++)
	{
		if(!vis[i]&&g[x][i]) dfs(i);
	}
}
double dist(node a, node b)
{
	return sqrt((a.x - b.x) * (a.x - b.x) + 
	(a.y - b.y) * (a.y - b.y) + 
	(a.z - b.z) * (a.z - b.z));
}

int main(){
	cin>>T;
	while(T--)
	{
		flag=false;
		memset(vis,0,sizeof(vis));
		memset(g,0,sizeof(g));
		cin>>n>>h>>r;
		for(int i=1;i<=n;i++)
		{
			cin>>no[i].x>>no[i].y>>no[i].z;
		}
		for(int i=1;i<=n;i++)
			for(int j=i+1;j<=n;j++)
			{
				double k=dist(no[i], no[j]);
				if(k<=r+r) 
				{
					g[i][j]=true;
					g[j][i]=true;
				}
			}
		for(int i=1;i<=n;i++)
			if(no[i].z<=r)
				dfs(i);
		if(flag) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}

调了两小时了,有哪位大佬能帮忙调一下第一种做法,悬2~3关,感谢!

2023/8/6 18:58
加载中...