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

来源:互联网 发布:上海虹桥电缆网络销售 编辑:程序博客网 时间:2024/04/30 06:12

问题描述
从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

0 0
原创粉丝点击