1. 程式人生 > >【SSLGZ 1408】(樹)哈夫曼樹(二)

【SSLGZ 1408】(樹)哈夫曼樹(二)

問題描述
從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