一道赫夫曼树的经典题目,一直以为这题的代码会很复杂,没想到书中竟描述地如此简单
#include <stdio.h> int n; long long p[20010]; //一道经典的赫夫曼编码题 void swap(int &min1,int& min2) { int d; d=min1; min1=min2; min2=d; } int main() { scanf("%d",&n); int i; for(i=1;i<=n;i++) scanf("%lld",&p[i]); if(n==2||n==1) { long long sum=0; for(i=1;i<=n;i++) sum+=p[i]; printf("%lld\n",sum); return 0; } long long ans=0; while(n>1) { int min1=1,min2=2; if(p[min1]>p[min2]) swap(min1,min2); for(i=3;i<=n;i++) { if(p[i]<p[min1]) { min2=min1; min1=i; } else if(p[i]<p[min2]) min2=i; } long long t=p[min1]+p[min2]; ans+=t; if(min1==n)swap(min1,min2); p[min1]=t; p[min2]=p[n]; //p[min1]=t; //if(min1!=n)swap(min2,n); n--; } printf("%lld\n",ans); return 0; }