Huffman 인코딩 트리

1730 단어
제목: openjudge 6939
http://cqsyz.openjudge.cn/hanjai/7/
총 시간 제한: 1000ms
메모리 제한: 65536kB
묘사
n개의 외부 노드를 가진 확충 트리를 구축하고 각 외부 노드 Ki는 이 외부 노드의 권리로 대응하는 Wi가 있다.이 확장 두 갈래 나무의 잎 노드 테이프권 외부 경로 길이를 최소화합니다.
                                     Min( W1 * L1 + W2 * L2 + W3 * L3 + … + Wn * Ln)
Wi:각 노드의 권한 값입니다.
Li: 루트 노드에서 i번째 외부 잎 노드까지의 거리입니다.
프로그래밍은 최소 외부 경로의 길이를 계산합니다.
첫 번째 줄을 입력하고 외부 노드의 정수 n을 입력합니다.두 번째 줄은 n개의 정수를 입력하여 각 외부 노드의 값을 대표한다.
2<=N<=100 출력 최소 외부 경로 길이 총계.샘플 입력
4
1 1 3 5
샘플 출력
17

하프만 나무를 구축하고 대권 경로와.
#include 
#include 
#include 
using namespace std;
typedef struct node{
    int l,r;
    int p,w,fa;
    bool operatorx.w;
    }
}node;
node tr[220];
int main(){
    priority_queue q;
    int n,w,t;
    while(cin>>n){
        memset(tr,0,sizeof(tr));
        t=0;
        while(n--){
           cin>>w;
            ++t;
           tr[t]=node{0,0,t,w,0};
           q.push(tr[t]);
        }
        while(q.size()>1){
            node x1=q.top();
            q.pop();
            node x2=q.top();
            q.pop();
            ++t;
            tr[t]=node{x1.p,x2.p,t,x1.w+x2.w,0};
            tr[x1.p].fa=t;
            tr[x2.p].fa=t;
            q.push(tr[t]);
        }
        int ans=0;
        for(int i=1;i<=t;i++){
            if(tr[i].l==0){
                int dep=0;
                node x=tr[i];
                while(x.fa!=0){
                    dep++;
                    x=tr[x.fa];
                }
                ans+=dep*tr[i].w;
            }
        }
        cout<

좋은 웹페이지 즐겨찾기