Pagini recente » Cod sursa (job #370093) | Cod sursa (job #1414371) | Cod sursa (job #644157) | Cod sursa (job #418127) | Cod sursa (job #964654)
Cod sursa(job #964654)
program huffman;
type arbore=^celula;
celula=record
info:int64;
left,right:arbore;
end;
lista=^cel;
cel=record
arb:arbore;
next:lista;
end;
var bufin,bufout:array [1..100000] of byte;
a:array [1..1000000] of arbore;
n,i,j:longint;
l,v,r:lista;
r1:arbore;
lung:int64;
procedure dfs(u:arbore;h,bin:int64);
begin
if u^.left<>nil then dfs(u^.left,h+1,2*bin);
if u^.right<>nil then dfs(u^.right,h+1,2*bin+1);
if (u^.left=nil)and(u^.right=nil) then writeln(h,' ',bin);
end;
begin
assign(input,'huffman.in');
reset(input);
settextbuf(input,bufin);
assign(output,'huffman.out');
rewrite(output);
settextbuf(output,bufout);
readln(n);
for i:=1 to n do
begin
new(a[i]);
readln(a[i]^.info);
end;
l:=nil;
j:=1;
for i:=1 to n-1 do
begin
new(r);
new(r1);
if l<>nil then
begin
if j>n then
begin
r1^.info:=l^.arb^.info;
r1^.left:=l^.arb;
l:=l^.next;
end else begin
if l^.arb^.info<a[j]^.info then
begin
r1^.info:=l^.arb^.info;
r1^.left:=l^.arb;
l:=l^.next;
end else
begin
r1^.info:=a[j]^.info;
r1^.left:=a[j];
inc(j);
end;
end;end else
begin
r1^.info:=a[j]^.info;
r1^.left:=a[j];
inc(j);
end;
if l<>nil then
begin
if j>n then
begin
r1^.info:=r1^.info+l^.arb^.info;
r1^.right:=l^.arb;
l:=l^.next;
end else begin
if l^.arb^.info<a[j]^.info then
begin
r1^.info:=r1^.info+l^.arb^.info;
r1^.right:=l^.arb;
l:=l^.next;
end else
begin
r1^.info:=r1^.info+a[j]^.info;
r1^.right:=a[j];
inc(j);
end;
end;end else
begin
r1^.info:=r1^.info+a[j]^.info;
r1^.right:=a[j];
inc(j);
end;
lung:=lung+r1^.info;
r^.arb:=r1;
r^.next:=nil;
if l=nil then
begin
l:=r;
v:=r;
end else
begin
v^.next:=r;
v:=r;
end;
end;
writeln(lung);
dfs(r1,0,0);
close(output);
end.