bawang51吧 关注:31贴子:3,169
  • 4回复贴,共1
var a:array[1..100,1..100]of longint;
b:array[1..100,0..100]of longint;
f:array[1..100]of longint;
d:array[1..100]of longint;
v:array[1..100]of boolean;
i,p,c,x,y,z,now,s,t,aa,bb:longint;
begin
   readln(p,c);
   for i:=1 to c do
     begin
       readln(x,y,z);
       a[x,y]:=z;
       a[y,x]:=z;
       b[x,0]:=b[x,0]+1;
       b[x,b[x,0]]:=y;
       b[y,0]:=b[y,0]+1;
       b[y,b[y,0]]:=x;
     end;
   readln(s,t);
   for i:=1 to p do
     d[i]:=maxlongint;
   f[1]:=s;
   d[s]:=0;
   now:=f[1];
   v[s]:=true;
   aa:=1;
   bb:=1;
   while aa<=bb do
     begin
       now:=f[aa];
       for i:=1 to b[now,0] do
         begin
           if d[b[now,i]]>a[b[now,i],now]+d[now] then
             begin
               d[b[now,i]]:=a[b[now,i],now]+d[now];
               if not v[b[now,i]] then
                 begin
                   bb:=bb+1;
                   f[bb]:=b[now,i];
                   v[b[now,i]]:=true;
                 end;
             end;
         end;
       v[now]:=false;
       aa:=aa+1;
     end;
   writeln(d[t]);
end.



IP属地:上海1楼2011-06-07 23:41回复
    优化过的:
    var a:array[1..100,1..100]of longint;
    b:array[1..100,0..100]of longint;
    f:array[1..1000]of longint;
    d:array[1..100]of longint;
    v:array[1..100]of boolean;
    i,j,aa,bb,x,y,now,s,t,n,p:longint;
    begin
    readln(n,p);
    for i:=1 to p do
    begin
    for j:=1 to p do
    a[i,j]:=maxlongint shr 2;
    d[i]:=maxlongint shr 2;
    a[i,i]:=0;
    end;
    for i:=1 to n do
    begin
    readln(x,y,a[x,y]);
    a[y,x]:=a[x,y];
    b[x,0]:=b[x,0]+1;
    b[x,b[x,0]]:=y;
    b[y,0]:=b[y,0]+1;
    b[y,b[y,0]]:=x;
    end;
    readln(s,t);
    aa:=1;
    bb:=1;
    d[s]:=0;
    f[1]:=s;
    v[s]:=true;
    while aa<=bb do
    begin
    now:=f[aa];
    for i:=1 to b[now,0] do
    begin
    if d[b[now,i]]>d[now]+a[now,b[now,i]] then
    begin
    d[b[now,i]]:=d[now]+a[now,b[now,i]];
    if not v[b[now,i]] then
    begin
    bb:=bb+1;
    f[bb]:=b[now,i];
    v[b[now,i]]:=true;
    end;
    end;
    end;
    v[now]:=false;
    aa:=aa+1;
    end;
    writeln(d[t]);
    end.


    IP属地:上海2楼2011-08-16 17:19
    回复
      2025-05-14 04:40:53
      广告
      前向星优化
      var
      a,b,e:array[1..1000]of longint;
      vis:array[1..2000]of boolean;
      q,d,f:array[1..2001]of longint;
      n,m,i,s,t:longint;
      procedure qsort(l,r:longint);
      var i,j,x,y:longint;
      begin
      i:=l;
      j:=r;
      x:=a[(l+r) shr 1];
      repeat
      while a[i]<x do inc(i);
      while a[j]>x do dec(j);
      if not (i>j) then
      begin
      y:=a[i];
      a[i]:=a[j];
      a[j]:=y;
      y:=b[i];
      b[i]:=b[j];
      b[j]:=y;
      y:=e[i];
      e[i]:=e[j];
      e[j]:=y;
      inc(i);
      dec(j);
      end;
      until i>j;
      if i<r then qsort(i,r);
      if l<j then qsort(l,j);
      end;
      procedure spfa(s:longint);
      var i,k,l,t:longint;
      begin
      fillchar(vis,sizeof(vis),false);
      for i:=1 to n do
      d[i]:=maxlongint;
      d[s]:=0;
      l:=0;
      t:=1;
      q[1]:=s;
      vis[s]:=true;
      repeat
      l:=l mod 10000+1;
      k:=q[l];
      for i:=f[k] to f[k+1]-1 do
      if d[k]+e[i]<d[b[i]] then
      begin
      d[b[i]]:=d[k]+e[i];
      if not vis[b[i]] then
      begin
      t:=t mod 10000+1;
      q[t]:=b[i];
      vis[b[i]]:=true;
      end;
      end;
      vis[k]:=false;
      until l=t;
      end;
      begin
      readln(n,m);
      for i:=1 to m do
      readln(a[i],b[i],e[i]);
      qsort(1,m);
      for i:=1 to m do
      if f[a[i]]=0 then
      f[a[i]]:=i;
      f[n+1]:=m+1;
      for i:=n downto 1 do
      if f[i]=0 then
      f[i]:=f[i+1];
      readln(s,t);
      spfa(s);
      writeln(d[t]);
      end.


      IP属地:上海3楼2011-10-24 21:35
      回复
        顶起来!!


        IP属地:上海4楼2014-04-05 20:43
        回复
          为啥我以前起的变量名都是这样的!!?!?!?!?!?!


          IP属地:上海5楼2014-04-05 20:44
          回复