2017noip day2 t1
洛谷传送门
题目描述
解题思路:我们只需要找一个与奶酪下表面相连接的一个空洞,找一个与这个空洞相连接的空洞,再跑一遍dfs判断最后是否与奶酪的顶部相连通。联通ans++就行(无需要最短)。
本题还要注意此题的数据范围和在题干中有个绝对值,我开始在读入优化中就没有考虑负数坐标,100分就直接扣掉了20早知道就该好好将读入优化打完。
下面为完整代码
/***********************
* Problem:P3958 奶酪 *
* User: mzg1824_TY *
* Language: C++ *
* Date:2018.1.21 *
* algorithm:深度优先搜索 *
**********************/
#include<bits/stdc++.h>
#define ll long long
#define M 1000000+5
using namespace std;
const int maxn=1000+5;
long long x[maxn],y[maxn],z[maxn],vis[maxn];
ll T,n,h,r;
bool ok;
struct node{
ll x,y,z;
}e[M];//结构体存储空洞数据
void init()
{
freopen("input.txt","r",stdin);
}
ll read()
{
ll x=0,f=1;
char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){x=10*x+ch-'0';ch=getchar();}
return x*f;
}
bool pd(int a,int b)//判断两个空洞是否相邻,相邻则返回真,否则返回假
{
if((e[a].x-e[b].x)*(e[a].x-e[b].x)+(e[a].y-e[b].y)*(e[a].y-e[b].y)+(e[a].z-e[b].z)*(e[a].z-e[b].z)<=4*(long long)r*r)
return true;
else return false;
}
void dfs(int i)
{
if(ok) return;//跑过了就退出
vis[i]=true;//染色标记,缩减时间
if(e[i].z>=h-r)
{
ok=true;
return;//如果到了上表面,也就是小鼠能上去则返回真
}
for(ll j=1;j<=n;j++)
{
if(vis[j]==0 && pd(i,j))//两个空洞相邻且没有被染色
{
dfs(j);
}
}
}
bool check()
{
ok=false;
memset(vis,0,sizeof(vis));
for (ll i=1;i<=n;i++)
{
if(vis[i]==0 && e[i].z<=r)//如果这个点是下表面,便从这个点起跑。
{
dfs(i);
}
}
return ok;
}
void readdata()
{
int u,v;
T=read();
for(ll i=1;i<=T;i++)
{
n=read();
h=read();
r=read();
for(ll j=1;j<=n;j++)
{
e[j].x=read();
e[j].y=read();
e[j].z=read();
}
if(check())
printf("Yes\n");
else
printf("No\n");
}
}
void work()
{
}
int main()
{
init();
readdata();
work();
return 0;
}//希望能够有帮助