最短路径
2015-11-01 14:44
232 查看
思路:用动态规划。
同传纸条的思想,把一来一回看做两条路。用f[i,j]表示第一条路到点i第二条路到点j时距离终的距离,输出f[0,0]就好了。
注意:到f[i,j]时,前max(i,j)个点已经走过了。
program paths; uses math; type dott=record x,y:longint; end; var best:real; dot:array[0..1001] of dott; n,m,b1,b2,i:longint; dt,f:array[0..1001,0..1001] of real;//dt数组表示i,j两点间直接相连的距离。 function cl(i,j:longint):real; begin exit(sqrt(sqr(dot[i].x-dot[j].x)+sqr(dot[i].y-dot[j].y))); end; procedure init; var i,j:longint; begin read(n,b1,b2); for i:=0 to n-1 do read(dot[i].x,dot[i].y); for i:=0 to n-1 do for j:=i+1 to n-1 do begin dt[i,j]:=cl(i,j); end; for i:=0 to n do for j:=0 to n do f[i,j]:=-1; end; function dfs(x,y:longint):real; var now:longint; begin if f[x,y]<>-1 then exit(f[x,y]);//已经求出来了就不用再继续了。 now:=max(x,y); if now>n-1 then exit(maxlongint div 2); if (now+1<>b1) and (now+1<>b2) then begin f[x,y]:=maxlongint; f[x,y]:=min(dfs(now+1,y)+dt[x,now+1],f[x,y]);//就是在三者中找最小值 f[x,y]:=min(f[x,y],dfs(x,now+1)+dt[y,now+1]);//一个表示第一条路中走下一个点,一个表示第二条路中走下一个点 end; if now+1=b1 then f[x,y]:=dfs(now+1,y)+dt[x,now+1];//因为b1,b2为特殊点,已经分配好了if now+1=b2 then f[x,y]:=dfs(x,now+1)+dt[y,now+1]; exit(f[x,y]); end; begin init; f[n-1,n-1]:=0; for i:=b1 to n-1 do//第一条路必须经过点b1 begin f[i,n-1]:=dt[i,n-1];//f[i,j]表示此时距终点的距离,且所有点都走过了 end; for i:=b2 to n-1 do//第二条路必须经过点b2 f[n-1,i]:=dt[i,n-1];//f[i,j]表示此时距终点的距离,且所有点都走过了
writeln(dfs(0,0):0:2); end.
相关文章推荐
- sftp与samba文件传输速度的对比
- Huatuo's Medicine
- android 音频播放 以及 二维码模块中音频播放和震动(vibrate)的实现
- 带你从源码角度理解Volley实现原理
- 程序员需要的好习惯
- 经典排序算法集锦
- Huatuo's Medicine
- uva 12545——Bits Equalizer
- 统计损失
- 代码整洁之道读书笔记--函数
- DDL、DML和DCL的比较【引用学习】
- Android自定义控件之仿美团下拉刷新
- android编程取消标题栏方法(appcompat_v7、NoTitleBar,2.3版本等)
- MYSQL查询SQL的注意事项和一些技巧总结
- VisionPro笔记:色彩区分
- InputSplit—>RecordReder—>map(key,value,context)的过程解析
- ThinkPHP如何禁止直接通过路径访问
- HDU 2049 错排变种
- CoreData的使用
- 杭电1282-回文