wikioi p1041 Car的旅行路线

本文通过具体的Pascal程序示例,介绍了程序中的关键算法及数据结构应用,包括坐标计算、距离测量、最短路径求解等核心部分。该程序涉及地图上的点与线的处理,计算不同点间的距离,并采用SPFA算法寻找两点间最小代价路径。

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

题目很烦。刷pascal的。

program aa;
const maxlongin=1000000000;
var k,n,s,t,b,e,i,j,cc,z,xmid,ymid,x4,y4:longint;
    ans:real;
    map:array[1..100,1..100] of real;
    dis:array[1..500] of real;
    x,y:array[1..500] of longint;
    pd:array[1..500] of boolean;
    a:array[1..10000] of longint;
procedure cac(x1,y1,x2,y2,x3,y3:longint);
  begin
    if (y2-y1)*(y2-y3)+(x2-x1)*(x2-x3)=0 then
      begin
        xmid:=(x1+x3);ymid:=(y1+y3);
        x4:=xmid-x2;y4:=ymid-y2;
      end
  end;
function  dist(p,q:longint):real;
  begin
    exit(sqrt(sqr(abs(x[p]-x[q]))+sqr(abs(y[p]-y[q]))));
  end;
procedure cl;
var x1,x2,x3,y1,y2,y3,i,j:longint;
  begin
    read(x1,y1,x2,y2,x3,y3,cc);
    cac(x1,y1,x2,y2,x3,y3);
    cac(x2,y2,x1,y1,x3,y3);
    cac(x1,y1,x3,y3,x2,y2);
    inc(n);x[n]:=x1;y[n]:=y1;
    inc(n);x[n]:=x2;y[n]:=y2;
    inc(n);x[n]:=x3;y[n]:=y3;
    inc(n);x[n]:=x4;y[n]:=y4;
    for i:=n-3 to n do
      for j:=n-3 to n do
        begin
          map[i,j]:=dist(i,j)*cc;
          map[j,i]:=dist(i,j)*cc;
        end;
  end;
procedure spfa(b:longint);
var f,r,i:longint;
  begin
    fillchar(pd,sizeof(pd),false);
    for i:=1 to n do dis[i]:=maxlongin;
    dis[b]:=0;
    f:=1;r:=1;a[f]:=b;pd[b]:=true;
    repeat
      for i:=1 to n do
        if (dis[i]>dis[a[f]]+map[a[f],i]) and (i<>a[f]) then
          begin
            dis[i]:=dis[a[f]]+map[a[f],i];
            if pd[i]=false then
              begin
                inc(r);
                a[r]:=i;
                pd[i]:=true;
              end;
          end;
      pd[a[f]]:=false;
      inc(f);
    until f>r;
  end;
begin
  read(z);
  for k:=1 to z do
    begin
      ans:=maxlongint;
      read(s,t,b,e);
      for i:=1 to s do
        cl;
      for i:=1 to n do
        for j:=1 to n do
          if (i-1) div 4<>(j-1) div 4 then 
          begin
            map[i,j]:=dist(i,j)*t;
            map[j,i]:=dist(i,j)*t;
          end;
      for i:=(b-1)*4+1 to b*4 do
        begin
          spfa(i);
          for j:=(e-1)*4+1 to e*4 do
              if dis[j]<ans then ans:=dis[j];
        end;
      writeln(ans:0:1);
    end;
end.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值