SSL1613最短路径问题

本文探讨了平面坐标系中寻找两点间最短路径的问题,使用Floyd和Dijkstra算法实现,介绍了两点间距离计算公式,并分析了不同算法的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值