天天看点

wikioi p1041 Car的旅行路线

题目很烦。刷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.