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;}
- hdu1245最短路+控制精度
- hdu1245 两个权值的最短路
- HDU1245 Saving James Bond(最短路+简单几何)
- hdu1245 Saving James Bond ,卡精度
- hdu1245
- HDU1245
- 精度控制
- HDU1245(Saving James Bond)最短路径-Floyd
- hpuoj--校赛--与学妹滑雪(最短路+精度判断)
- hpuoj 1722: 感恩节KK专场——与学妹滑雪 (最短路&精度)
- POJ2607/ZOJ1857 (最短路...注意题意及输入控制)
- 最短路 & 次短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- HDU 4260 The End of The World (递推&递归) #by Plato
- 有1000桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。现在我们用小老鼠做实验,要在1周后找出那桶毒酒,问最少需要多少老鼠
- Android ApiDemos示例解析(148):Views->Layouts->LinearLayout->8. Gravity
- eclipse中如何远程debug
- 在Linux中设置线程的优先级
- hdu1245最短路+控制精度
- 【STL】标准库中count与count_if函数说明与例子
- Acess错误:"文件共享锁定数溢出"
- svn “无法为URL打开ra_local会话”的错误原因之一
- 网络拓扑自动发现算法
- 原子和离子的区别
- linux下更人性化的编程工具~~朋友推荐
- uImage、zImage、bzImage、vmlinuz 区别
- GridView绑定图片