• P3958 奶酪


    P3958 奶酪


    暴力搜索,然而我noip bfs写炸了怪我太蒟蒻了

    先预处理出所有的路径(虽然这道题搜索的时候直接暴力判就可以,而且还比预处理跑的快)

    再dfs,对于一个点。如果已经访问了他,那么再访问就没有意义了。我们可以这样简单的做一个记忆

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    struct node
    {
    	long long x,y,z;
    };
    node data[1001];
    bool vis[1010];
    struct cym
    {
    	int point;
    	int nxt;
    }line[1000000];
    int head[1010],tail;
    bool flag;
    int n,h,r;
    void add(int a,int b)
    {
    	line[++tail].point=b;
    	line[tail].nxt=head[a];
    	head[a]=tail;
    }
    long long read()
    {
    	int s=0,w=1;
    	char in=getchar();
    	while(in<'0'||in>'9')
    	{
    		if(in=='-')
    			w=-1;
    		in=getchar();
    	}
    	while(in>='0'&&in<='9')
    	{
    		s=(s<<1)+(s<<3)+in-'0';
    		in=getchar();
    	}
    	return s*w;
    }
    void dfs(int x)
    {
    	vis[x]=true;
    	if(x==n+1)
    	{
    		flag=true;
    		return ;
    	}
    	for(int i=head[x];i;i=line[i].nxt)
    	{
    		if(!vis[line[i].point])
    			dfs(line[i].point);
    		if(flag)
    			return ;
    	}
    }
    double work(int i,int j)
    {
    	double res=sqrt((data[i].x-data[j].x)*(data[i].x-data[j].x)+(data[i].y-data[j].y)*(data[i].y-data[j].y)+(data[i].z-data[j].z)*(data[i].z-data[j].z));
    	return res;
    }
    int main()
    {
    	int t=read();
    	while(t--)
    	{
    		flag=false;
    		tail=0;
    		n=read();h=read();r=read();
    		for(int i=0;i<=n+1;i++)
    		{
    			vis[i]=false;
    			head[i]=0;	
    		}
    		for(int i=1;i<=n;i++)
    		{
    			data[i].x=read();
    			data[i].y=read();
    			data[i].z=read();
    		}
    		for(int i=1;i<=n;i++)
    			for(int j=i+1;j<=n;j++)
    				if(work(i,j)<=2.0*r)
    				{
    					add(i,j);
    					add(j,i);
    				}
    		for(int i=1;i<=n;i++)
    			if(data[i].z<=r)
    			{
    				add(0,i);
    				add(i,0);
    			}
    		for(int i=1;i<=n;i++)
    			if(data[i].z>=h-r)
    			{
    				add(n+1,i);
    				add(i,n+1);
    			}
    		vis[0]=true;
    		for(int i=head[0];i;i=line[i].nxt)
    		{
    			dfs(line[i].point);
    			if(flag)
    				break;
    		}
    		if(flag)
    			printf("Yes
    ");
    		else
    			printf("No
    ");	
    	}
    	return 0;
    }
    
  • 相关阅读:
    android创建自定义对话框
    激光裁剪的商务名片
    60个响应式的Web设计教程–能够手机访问!
    前端性能优化:使用Data URI代替图片SRC
    40个最好的Tumblr主题
    40个超酷的jQuery动画效果教程
    15个最好的jQuery timeline插件
    60+富有创意的宣传册设计
    Eclipse安装SVN
    EXPLAIN 关键字可以 查看 sql执行 的详细过程
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/8798764.html
Copyright © 2020-2023  润新知