【SSLGZ 1408】(樹)哈夫曼樹(二)
阿新 • • 發佈:2019-02-03
問題描述
從a開始的n個字母分別表示n個結點,分別代n個權值,以它們為葉子結點構造一棵哈夫曼樹(若兩節點權值相等,按照字典排序構造),最後求該哈夫曼樹路徑長。
樣例輸入
7
a b c d e f g
3 7 8 2 5 8 4
樣例輸出
a:1101
b:111
c:00
d:1100
e:101
f:01
g:100
100
演算法討論
主要還是構造哈弗曼樹,最後輸出要按字典輸出,再求一下路徑長度。(感覺自己寫得比較麻煩)
const
maxn=100;
var
a,b:array[0..maxn,1..2] of longint;
f:array[0..maxn,1 ..3] of longint;
v:array[1..maxn] of string;
v1:array[1..maxn] of longint;
d:array[1..maxn] of boolean;
i,j,k,n,t,ans:longint;
flag:boolean;
st:string;
c:char;
procedure sort(k:longint);
var
i,j,t:longint;
begin
for i:=1 to k-1 do
for j:=i+1 to k do
if (a[i,1]>a[j,1]) or ((a[i,1]=a[j,1]) and (a[i,2]>a[j,2]))
then begin
t:=a[i,1]; a[i,1]:=a[j,1]; a[j,1]:=t;
t:=a[i,2]; a[i,2]:=a[j,2]; a[j,2]:=t
end;
end;
procedure vist(t:longint);
begin
if f[t,1]=0
then begin
flag:=true;
exit
end ;
st:=st+'0';
inc(i);
vist(f[t,2]);
dec(i);
delete(st,i,1);
st:=st+'1';
inc(i);
vist(f[t,3]);
dec(i);
delete(st,i,1);
if flag
then begin
v[j]:=st;
v1[j]:=f[t,1];
inc(j);
flag:=false
end
else inc(ans,f[t,1]);
end;
begin
readln(n);
for i:=1 to 2*n-1 do
read(c);
for i:=1 to n do
begin
read(a[i,1]);
f[i,1]:=a[i,1];
a[i,2]:=i
end;
b:=a;
t:=n+1;
i:=n;
while i>1 do
begin
sort(i);
f[t,1]:=a[1,1]+a[2,1];
f[t,2]:=a[1,2];
f[t,3]:=a[2,2];
a[1,1]:=f[t,1];
a[1,2]:=t;
a[2,1]:=a[i,1];
a[2,2]:=a[i,2];
inc(t); dec(i)
end;
i:=1;
j:=1;
vist(t-1);
for i:=1 to n do
for j:=1 to n do
if (b[i,1]=v1[j]) and (d[j]=false)
then begin
write(chr(96+i),':');
writeln(v[j]);
d[j]:=true;
break
end;
write(ans)
end.
Pixiv ID:60470658