hdu1245最短路+控制精度

来源:互联网 发布:天津广播电视网络官网 编辑:程序博客网 时间:2024/05/17 20:38


这个题做的意义不大,找错得找好长时间。我的想法是以原点为0,边界能够到达的点为n+1,n+2.......

然后求从0到n+1.n+2......的最小值

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>using namespace std;const double oo=1e9*1.0;const int mn=2500;const int mm=100000;const int eps=1e-8;int ver[mm],next[mm];double cost[mm],dis[mn];int head[mn],q[mn],vis[mn],step[mn];int edge,m;struct node{    double x,y;    int id;}point[mn];int cmp(node a,node b){    if(a.x==b.x)    return a.y<b.y;    return a.x<b.x;}double Distance(double x1,double y1,double x2,double y2){    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}void addedge(int u,int v,double c){    ver[edge]=v,cost[edge]=c,next[edge]=head[u],head[u]=edge++;}void spfa(){    int i,u,v,l,r=0;    double tmp;    for(i=0;i<m;i++)   dis[i]=oo;    dis[q[r++]=0]=0;    for(l=0;l!=r;(++l>mn)?l=0:l)        for(i=head[u=q[l]],vis[u]=0;i>=0;i=next[i])        {            tmp=dis[u]+cost[i];            if(dis[v=ver[i]]>tmp+eps)            {                dis[v]=tmp;                step[v]=step[u]+1;                if(vis[u])  continue;                vis[q[r++]=v]=1;                if(r>=mn)   r=0;            }            if(fabs(dis[v=ver[i]]-tmp)<eps&&step[v]>step[u]+1)            {                step[v]=step[u]+1;                if(vis[u])  continue;                vis[q[r++]=v]=1;                if(r>=mn)   r=0;            }        }}int main(){    int n,i,j,ans1;    double dd,ans,d;    while(~scanf("%d%lf",&n,&d))    {        m=n+1;edge=0;        memset(head,-1,sizeof(head));        memset(vis,0,sizeof(vis));        memset(step,0,sizeof(step));        for(i=1;i<=n;i++)        {            scanf("%lf%lf",&point[i].x,&point[i].y);            point[i].id=i;        }        if(d+eps>=42.5)        {            printf("42.5 1\n");            continue;        }        point[0].x=0.0,point[0].y=0.0,point[0].id=0.0;        sort(point,point+n+1,cmp);        for(i=1;i<=n;i++)        {            if((dd=Distance(point[i].x,point[i].y,0.0,0.0))+eps<=7.5+d){                addedge(0,point[i].id,dd);            }        }        for(i=1;i<n;i++)        {            for(j=i+1;j<=n;j++)            {                if(point[i].x+eps<-50.0||point[i].x+eps>50.0)   continue;                if(point[i].y+eps<-50.0||point[i].y+eps>50.0)   continue;                if(point[j].x+eps<-50.0||point[j].x+eps>50.0)   continue;                if(point[j].y+eps<-50.0||point[j].y+eps>50.0)   continue;                if((dd=Distance(point[i].x,point[i].y,point[j].x,point[j].y)+eps)<=d)                    addedge(point[i].id,point[j].id,dd);            }        }        for(i=0;i<=n;i++)            if((dd=50.0-point[i].x+eps)<=d)            {                point[m].x=50.0,point[m].y=point[i].y,point[m].id=m;                addedge(point[i].id,m,dd);                m++;//cout<<"yes1 "<<dd<<endl;            }         for(i=0;i<=n;i++)            if((dd=point[i].x+50.0+eps)<=d)            {                point[m].x=-50.0,point[m].y=point[i].y,point[m].id=m;                addedge(point[i].id,m,dd);                m++;//cout<<"yes2 "<<dd<<endl;            }         for(i=0;i<=n;i++)            if((dd=50.0-point[i].y+eps)<=d)            {                point[m].y=50.0,point[m].x=point[i].x,point[m].id=m;                addedge(point[i].id,m,dd);                m++;//cout<<"yes3 "<<dd<<endl;            }         for(i=0;i<=n;i++)            if((dd=point[i].y+50.0+eps)<=d)            {                point[m].y=-50.0,point[m].x=point[i].x,point[m].id=m;                addedge(point[i].id,m,dd);                m++;//cout<<"yes4 "<<dd<<endl;            }        spfa();        ans=oo;        for(i=n+1;i<m;i++)            if(dis[i]>0&&dis[i]<ans)  ans=dis[i],ans1=step[i];        for(i=1;i<=n;i++)            if(fabs(point[i].x)==50.0||fabs(point[i].y)==50.0)                if(dis[i]>0&&dis[i]<ans)    ans=dis[i],ans1=step[i];        if(ans<oo)  printf("%.2lf %d\n",ans-7.5,ans1);        else printf("can't be saved\n");    }    return 0;}


原创粉丝点击