您的位置:首页 > 其它

最短路径

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: