果然调试的时候F7到某阶段再结合数据比较好调= =
这样比较具体思维不抽象比较好想
不过这样的话需要强大的出数据能力
就这点来说我现在弱了不少
真不应该
下面贴代码
d[i]表示点1到点i的距离
k[i]表示d[i]里面存的是哪一个点
b[i]表示点i存在d的哪一个位置
type data=record
i:integer;
d:longint;
end;
var a:array[1..10000,1..100]of data;
c,b,k:array[1..10000]of integer;
d:array[1..10000]of longint;
n:integer;
procedure init;
var i,m,x,y,z:integer;
begin
fillchar(c,sizeof(c),0);
readln(n,m);
for i:=1 to m do
begin
readln(x,y,z);
inc(c[x]);
a[x,c[x]].i:=y;
a[x,c[x]].d:=z;
inc(c[y]);
a[y,c[y]].i:=x;
a[y,c[y]].d:=z;
end;
end;
procedure heap(x,n:integer);
var j,z,z1,z2:integer;
begin
z:=d[x];z1:=k[x];
while x
begin
j:=x*2;
if (j
if z>d[j] then
begin
d[x]:=d[j];
k[x]:=k[j];
b[k[j]]:=x;
x:=j;
end
else break;
end;
d[x]:=z;
k[x]:=z1;
b[z1]:=x;
end;
procedure inst(x:integer);
var z,z1:integer;
begin
z:=d[x];z1:=k[x];
while (x>1)and(d[x]
begin
d[x]:=d[x shr 1];
k[x]:=k[x shr 1];
b[k[x shr 1]]:=x;
x:=x shr 1;
end;
d[x]:=z;
k[x]:=z1;
b[z1]:=x;
end;
procedure dijk;
var i,j,x,x1,z,z1,z2:integer;
begin
for i:=1 to n do k[i]:=i;
for i:=1 to n do b[i]:=i;
for i:=1 to n do d[i]:=9999;
d[1]:=0;
for i:=1 to n do
begin
x:=d[1];x1:=k[1];
z:=d[1];d[1]:=d[n-i+1];d[n-i+1]:=z;
z:=b[k[1]];b[k[1]]:=b[k[n-i+1]];b[k[n-i+1]]:=z;
z:=k[1];k[1]:=k[n-i+1];k[n-i+1]:=z;
heap(1,n-i);
for j:=1 to c[x1] do
begin
if x+a[x1,j].d
begin
d[b[a[x1,j].i]]:=x+a[x1,j].d;
inst(b[a[x1,j].i]);
end;
end;
end;
end;
procedure outp;
var i:integer;
begin
for i:=1 to n do write(d[b[i]],' ');
end;
begin
init;
dijk;
outp;
end.
没有评论:
发表评论