SSL P1408【树】哈夫曼树(二)

来源:互联网 发布:sql降序查询 编辑:程序博客网 时间:2024/06/06 20:18

Description

有n(n<=26)个带权结点,从a开始的n个字母分别表示这n个结点,他们分别代n个权值,试以它们为叶子结点构造一棵哈夫曼树(请按照左子树根节点的权小于等于右子树根节点的权的次序构造,若两结点相等时,按照字典顺序分别为左子树和右子树)。 最后求出该哈夫曼树的带权路径长度.

Input

第一行为一个n的值;第二行为n个字母,中间用空格分开;第三行为n个数字,分别表示着n个字母代表的数值.

Output

共计n+1行,前n行分别为按照字母表的顺序输出各个字母和编码,中间用冒号分开,第n+1行为该哈夫曼树的带权路径长度

Sample Input

Sample Output

7
a b c d e f g
3 7 8 2 5 8 4
Hint

a:1101
b:111
c:00
d:1100
e:101
f:01
g:100
100

哈夫曼树:
1.建立一棵哈弗曼树。
2.访问。
3.注意用字典序判断前后顺序。
4.没有根节点之后记录编码,并累加权值总和。

type  arr=record         data:longint;         l,r:longint;         addr:longint;         zm:char;         ans:string;      end;var     f,a:array[0..101] of arr;     i,j,t,n,sum,x:longint;     s:string;     p:char;procedure mp(k:longint);var  i,j:longint;  t:arr;begin   for i:=1 to k-1 do       for j:=i+1 to k do           if (a[i].data>a[j].data) or              ((a[i].data=a[j].data) and (a[i].zm>=a[j].zm))              then begin                      t:=a[i];                      a[i]:=a[j];                      a[j]:=t;                   end;end;procedure vist(o:string;t:longint);begin   if f[t].data=0 then exit;   vist(o+'0',f[t].l);   vist(o+'1',f[t].r);   if f[t].l=0 then      if f[t].r=0 then         begin             f[t].ans:=o;             sum:=sum+length(o)*f[t].data;         end;end;begin   readln(n);   readln(s);   for i:=1 to n do       begin           a[i].zm:=s[i*2-1];           f[i].zm:=a[i].zm;       end;   for i:=1 to n do   begin      read(a[i].data);      f[i].data:=a[i].data;      a[i].addr:=i;   end;  t:=n+1; i:=n;  while i>1 do        begin           mp(i);           f[t].data:=a[1].data+a[2].data;           f[t].l:=a[1].addr;           f[t].r:=a[2].addr;           a[1].zm:=chr(ord('z')+1);           a[1].data:=f[t].data;           a[1].addr:=t;           a[2].data:=a[i].data;           a[2].addr:=a[i].addr;           a[2].zm:=a[i].zm;           inc(t); dec(i);     end;    vist('',t-1);    for p:='a' to 'z' do        for i:=1 to 26 do if  f[i].zm=p then writeln(p,':',f[i].ans);    writeln(sum);end.
1 0
原创粉丝点击