您的位置:首页 > 其它

SSL1613最短路径问题

2016-12-09 19:29 337 查看

SSL1613最短路径问题

题目

平面上有n个点(N<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点直线的距离。现在的任务是找出从一点到另一点之间的最短路径。

题意

给出n个点,其中的一些点之间有连线,两点间的距离需自己求,求一点到另一点之间的最短路径。

题解

1.两点间的距离:横坐标差与纵坐标差的平方的和的平方根

sqrt(sqr(abs(x[i]-x[j]))+sqr(abs(y[i]-y[j])))

2.Floyd,Dijkstra等求最短路径的算法均可

3.时间复杂度:Floyd=O(n*n*n)Dijkstra=O(n*n)

代码

1.Floyd

var
n,i,j,k,q,p,s,t,m:longint;
x,y:array[1..100]of real;
a:array[1..100,1..100]of real;
begin
readln(n);
fillchar(a,sizeof(a),$7f);
for i:=1 to n do
readln(x[i],y[i]);
readln(m);
for i:=1 to m do
begin
readln(q,p);
a[q,p]:=sqrt(sqr(abs(x[q]-x[p]))+sqr(abs(y[q]-y[p])));
a[p,q]:=a[q,p];
end;
readln(s,t);
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if a[i,k]+a[k,j]<a[i,j] then
begin
a[i,j]:=a[i,k]+a[k,j];
a[j,i]:=a[i,j];
end;
writeln(a[s,t]:0:2);
end.


2.Dijkstra

var
n,i,j,q,p,s,t,m:longint;
k:real;
x,y:array[0..100]of real;
b:array[0..100]of boolean;
a:array[0..100,0..100]of real;
begin
readln(n);
fillchar(a,sizeof(a),$7f);
for i:=1 to n do
readln(x[i],y[i]);
readln(m);
for i:=1 to m do
begin
readln(q,p);
a[q,p]:=sqrt(sqr(abs(x[q]-x[p]))+sqr(abs(y[q]-y[p])));
a[p,q]:=a[q,p];
end;
readln(s,p);
for i:=1 to n do
x[i]:=a[s,i];
fillchar(b,sizeof(b),false);
b[s]:=true;

repeat
k:=maxlongint;t:=0;
for j:=1 to n do
if (x[j]<k)and(not b[j]) then
begin
k:=x[j];
t:=j;
end;
if t<>0 then
begin
b[t]:=true;
for j:=1 to n do
if (not b[j])and(x[t]+a[t,j]<x[j]) then
x[j]:=x[t]+a[t,j];
end;
until t=0;
writeln(x[p]:0:2);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: