SSL1613最短路径问题

来源:互联网 发布:kiss乐队 知乎 编辑:程序博客网 时间:2024/05/18 00:59

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.
1 0
原创粉丝点击