博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU_1245_Saving James Bond_最短路
阅读量:5341 次
发布时间:2019-06-15

本文共 2211 字,大约阅读时间需要 7 分钟。

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1245

题意:给一个已知直径的圆形岛,然后岛的附近是湖,湖里有一些点,以坐标的形式给出,最外层是矩形的终点。

给定跳跃的距离d,让你判断是否能跳到最外层,如果能就输出最短距离以及这个最短跳的步数。

题解:

 这题重点在建图,在松弛操作那里也要修改一下。详细看代码。

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #define cl(a,b) memset(a,b,sizeof(a));12 #define FFC(i,a,b) for(int i=a;i<=b;i++)13 #define FFI(i,a,b) for(int i=a;i>=b;i--)14 #define pb push_back15 #define LL long long16 using namespace std;17 void fre(){freopen("c:\\acm\\input.txt","r",stdin);}18 const double INF=1e9,eps=1e-5;19 const int MAXN=110,MAXM=11000;20 typedef pair
P;21 priority_queue

,greater

>Q;22 int v[MAXM],g[MAXN],nxt[MAXM],ed,i,x,N,pre[MAXN];23 double w[MAXM],d[MAXN];24 int n,xx,yy,cnt,K;25 void init(int n){ for(i=1,ed=0,N=n;i<=n;i++)g[i]=0;}26 void adg(int x,int y,double z){v[++ed]=y,w[ed]=z,nxt[ed]=g[x],g[x]=ed;}27 void dijkstra(int S){28 for(i=1;i<=N;i++)d[i]=INF,pre[i]=S;Q.push(P(d[S]=0,S));29 while(!Q.empty()){30 P t=Q.top();Q.pop();31 if(t.first>d[x=t.second])continue;32 for(i=g[x];i;i=nxt[i])if(d[x]+w[i]

K)){ //距离必须小于K才能跳33 pre[v[i]]=x;//记录路径34 Q.push(P(d[v[i]]=d[x]+w[i],v[i]));35 }36 }37 }38 struct dt{39 int x,y;40 }a[110];41 int abs(int a){ return a
eps){adg(1,i,tmp-7.5);adg(i,1,tmp-7.5);}49 }50 FFC(i,2,cnt)FFC(j,i,cnt){51 if(i==j){adg(i,j,0);adg(j,i,0);}52 else{53 double tmp=getdis(a[i].x,a[i].y,a[j].x,a[j].y);54 adg(i,j,tmp);55 adg(j,i,tmp);56 }57 }58 //cnt+1为终点59 FFC(i,2,cnt){60 int min=(50-abs(a[i].x))>(50-abs(a[i].y))?(50-abs(a[i].y)):(50-abs(a[i].x));61 adg(cnt+1,i,(double)min);62 adg(i,cnt+1,(double)min);63 }64 }65 int getlong(){66 int an=0,i=cnt+1;67 while(pre[i]!=i){68 i=pre[i],an++;69 }70 return an;71 }72 int main(){73 //fre();74 while(~scanf("%d%d",&n,&K)){75 cnt=1;76 FFC(i,1,n){77 scanf("%d%d",&xx,&yy);78 if(xx<50&&yy<50)a[++cnt].x=xx,a[cnt].y=yy;79 }80 //特判,如果K大于42.5可一步跳到岸边81 if(K>=42.5){printf("42.50 1\n");continue;}82 init(cnt+1);83 build_g();//建图84 dijkstra(1);85 double ans=d[cnt+1];86 if(ans

View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/5696190.html

你可能感兴趣的文章
[工具] Sublime Text 使用指南
查看>>
Hangfire在ASP.NET CORE中的简单实现方法
查看>>
Algorithm——何为算法?
查看>>
Web服务器的原理
查看>>
小强升职计读书笔记
查看>>
常用的107条Javascript
查看>>
#10015 灯泡(无向图连通性+二分)
查看>>
忘记root密码,怎么办
查看>>
linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
查看>>
《黑客与画家》 读书笔记
查看>>
bzoj4407: 于神之怒加强版
查看>>
mysql统计一张表中条目个数的方法
查看>>
ArcGIS多面体(multipatch)解析——引
查看>>
css3渐变画斜线 demo
查看>>
JS性能DOM优化
查看>>
设计模式 单例模式 使用模板及智能指针
查看>>
HAL层三类函数及其作用
查看>>
Odoo 去掉 恼人的 "上午"和"下午"
查看>>
web@h,c小总结
查看>>
java编程思想笔记(一)——面向对象导论
查看>>