• bzoj1975


    显然是类似k短路,直接不停增广即可

    好久没写A*了,裸的A*可能会TLE

    加点剪枝就卡过去了………

      1 type node=record
      2        po,next:longint;
      3        cost:double;
      4      end;
      5      point=record
      6        loc:longint;
      7        num:double;
      8      end;
      9 
     10 var e,ee:array[0..200010] of node;
     11     d:array[0..5010] of double;
     12     q:array[0..2000010] of longint;
     13     h:array[0..2000010] of point;
     14     p,pp:array[0..5010] of longint;
     15     v:array[0..5010] of boolean;
     16     ans,t,x,y,i,len,n,m:longint;
     17     z,te:double;
     18 
     19 procedure swap(var a,b:point);
     20   var c:point;
     21   begin
     22     c:=a;
     23     a:=b;
     24     b:=c;
     25   end;
     26 
     27 procedure add(x,y:longint; z:double);
     28   begin
     29     e[i].po:=y;
     30     e[i].next:=p[x];
     31     e[i].cost:=z;
     32     p[x]:=i;
     33   end;
     34 
     35 procedure eadd(x,y:longint; z:double);
     36   begin
     37     ee[i].po:=y;
     38     ee[i].next:=pp[x];
     39     ee[i].cost:=z;
     40     pp[x]:=i;
     41   end;
     42 
     43 procedure spfa;
     44   var f,r,i,x,y:longint;
     45   begin
     46     for i:=1 to n-1 do
     47       d[i]:=1e40;
     48     d[n]:=0;
     49     f:=1;
     50     r:=1;
     51     q[1]:=n;
     52     while f<=r do
     53     begin
     54       x:=q[f];
     55       v[x]:=false;
     56       i:=pp[x];
     57       while i<>0 do
     58       begin
     59         y:=ee[i].po;
     60         if d[y]>d[x]+ee[i].cost then
     61         begin
     62           d[y]:=d[x]+ee[i].cost;
     63           if not v[y] then
     64           begin
     65             v[y]:=true;
     66             inc(r);
     67             q[r]:=y;
     68           end;
     69         end;
     70         i:=ee[i].next;
     71       end;
     72       inc(f);
     73     end;
     74   end;
     75 
     76 procedure sift(i:longint);
     77   var j:longint;
     78   begin
     79     j:=i shl 1;
     80     while j<=t do
     81     begin
     82       if (j<t) and (h[j].num>h[j+1].num) then inc(j);
     83       if h[i].num>h[j].num then
     84       begin
     85         swap(h[i],h[j]);
     86         i:=j;
     87         j:=j shl 1;
     88       end
     89       else break;
     90     end;
     91   end;
     92 
     93 procedure up(i:longint);
     94   var j:longint;
     95   begin
     96     j:=i shr 1;
     97     while j>0 do
     98     begin
     99       if h[i].num<h[j].num then
    100       begin
    101         swap(h[i],h[j]);
    102         i:=j;
    103         j:=j shr 1;
    104       end
    105       else break;
    106     end;
    107   end;
    108 
    109 procedure astar;
    110   var i,x,y:longint;
    111       dis:double;
    112 
    113   begin
    114     h[1].loc:=1;
    115     h[1].num:=d[1];
    116     t:=1;
    117     while t>0 do
    118     begin
    119       x:=h[1].loc;
    120       dis:=h[1].num-d[x];
    121       swap(h[1],h[t]);
    122       dec(t);
    123       sift(1);
    124       if x=n then
    125       begin
    126         if te<dis then break
    127         else begin
    128           inc(ans);
    129           te:=te-dis;
    130         end;
    131       //  writeln(te,' ',dis);
    132       end;
    133       i:=p[x];
    134       while i<>0 do
    135       begin
    136         y:=e[i].po;
    137         if dis+e[i].cost+d[y]<=te then
    138         begin
    139           inc(t);
    140           h[t].loc:=y;
    141           h[t].num:=dis+e[i].cost+d[y];
    142           up(t);
    143         end;
    144         i:=e[i].next;
    145       end;
    146     end;
    147   end;
    148 
    149 begin
    150   readln(n,m,te);
    151   for i:=1 to m do
    152   begin
    153     readln(x,y,z);
    154     add(x,y,z);
    155     eadd(y,x,z);
    156   end;
    157   spfa;
    158   astar;
    159   writeln(ans);
    160 end.
    View Code
  • 相关阅读:
    大三学长带我学习JAVA.作业8。。1 有1、2、3、4这几个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
    详解Manifest
    反射机制和配置文件的用法
    大三学长带我学习JAVA.作业8。 判断101200之间有多少个素数,并输出所有素数。
    序曲
    java打包生成jar和exe全过程
    大三学长带我学习JAVA.作业6 编写日历表 和vim
    大三学长带我学习JAVA.作业7 利用for循环打印 9*9 表
    动态代理类
    pku 3522 Slim Span
  • 原文地址:https://www.cnblogs.com/phile/p/4609503.html
Copyright © 2020-2023  润新知