ACM算法集5

ACM算法集5
十五、數據結構相關算法
1
.鏈表的定位函數loc(I:integer):pointer; {尋找鏈表中的第I個結點的指針}
procedure loc(L:linklist; I:integer):pointer;
var p:pointer;
j:integer;
begin
p:=L.head; j:=0;
if (I>=1) and (I<=L.len) then
while j<I do begin p:=p^.next; inc(j); end;
loc:=p;
end;
2
.單鏈表的插入操作

procedure insert(L:linklist; I:integer; x:datatype);
var p,q:pointer;
begin
p:=loc(L,I);
new(q);
q^.data:=x;
q^.next:=p^.next;
p^.next:=q;
inc(L.len);
end;
3
.單鏈表的刪除操作
procedure delete(L:linklist; I:integer);
var p,q:pointer;
begin
p:=loc(L,I-1);
q:=p^.next;
p^.next:=q^.next;
dispose(q);
dec(L.len);
end;
4
.雙鏈表的插入操作(插入新結點q
p:=loc(L,I);
new(q);
q^.data:=x;
q^.pre:=p;
q^.next:=p^.next;
p^.next:=q;
q^.next^.pre:=q;
5
.雙鏈表的刪除操作
p:=loc(L,I); {p
爲要刪除的結點}
p^.pre^.next:=p^.next;
p^.next^.pre:=p^.pre;
dispose(p);
關鍵路徑(最長路經):

var a,b:array [1..10,1..10] of integer;
n,last,out:integer;
q,c:array [1..10] of integer;
o:set of 1..10;
procedure init;
var i,j:integer;
begin
readln(n);
for i:=1 to n do
for j:=1 to n do
read(a[i,j]);
last:=0;
o:=[]; out:=0;
b:=a;
end;
procedure sort;
var i,j:integer;
p:boolean;
begin
while out<>n do begin
for i:=1 to n do
if not (i in o) then begin
p:=true;
for j:=1 to n do
if a[j,i]=1 then begin
p:=false;
break;
end;
if p then begin
inc(last);
q[last]:=i;
inc(out);
o:=o+[i];
fillchar(a[i],sizeof(a[i]),0);
end;
end;
end;
end;
procedure work_1;
var i,j,t,k:integer;
begin
a:=b; c[1]:=0;
for i:=1 to n do begin
k:=0;
for j:=1 to i-1 do
if (a[q[j],q[i]]>0) and (a[q[j],q[i]]+c[q[j]]>k)
then k:=a[q[j],q[i]]+c[q[j]];
c[q[i]]:=k;
end;
end;
procedure work_2;
var i,j,k:integer;
begin
writeln(q[n]);
for i:=n-1 downto 1 do begin
k:=maxint;
for j:=i+1 to n do
if (a[q[i],q[j]]>0) and (c[q[j]]-a[q[i],q[j]]<k) then k:=c[q[j]]-a[q[i],q[j]];
if c[q[i]]=k then writeln(q[i],' ');
c[q[i]]:=k;
end;
end;
begin
init;
sort;
work_1;
work_2;
end.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章