Pagini recente » Cod sursa (job #1922050) | Cod sursa (job #906953) | Cod sursa (job #1327615) | Cod sursa (job #2841359) | Cod sursa (job #2620827)
//
// main.cpp
// coduri hoofman
//
// Created by Eusebiu Rares on 29/05/2020.
// Copyright © 2020 Eusebiu Rares. All rights reserved.
//
#include <iostream>
#include "fstream"
#include "queue"
#define level left
#define cod right
#define left first
#define right second
const int MV = 2e6 ;
std::fstream in ("huffman.in", std::ios::in) ;
std::fstream out ("huffman.out", std::ios::out) ;
long long id[MV + 1] ;
std::queue<int> firstQueue, secondQueue ;
int nodes ;
std::pair <int, int> arb[MV + 1] ;
int code[MV + 1] ;
long long code2[MV + 1] ;
int small() {
if (firstQueue.empty()) {
int candidateA = secondQueue.front() ;
secondQueue.pop() ;
return candidateA ;
}
if (secondQueue.empty()) {
int candidateA = firstQueue.front() ;
firstQueue.pop() ;
return candidateA ;
}
int candidateA = firstQueue.front() ;
int candidateB = secondQueue.front() ;
if (id[candidateA] <= id[candidateB]) {
firstQueue.pop() ;
return candidateA ;
} else {
secondQueue.pop() ;
return candidateB ;
}
}
void addNode(int x, int y) {
id[++ nodes] = id[x] + id[y] ;
secondQueue.push(nodes) ;
arb[nodes] = {x, y} ;
}
void createArb() {
while (firstQueue.size() + secondQueue.size() >= 2) {
int smallest = small() ;
int help = small() ;
addNode(smallest, help) ;
}
}
void dfs(int node) {
code[arb[node].left] = code[node] + 1 ;
code[arb[node].right] = code[node] + 1 ;
code2[arb[node].left] = code2[node] << 1 ;
code2[arb[node].right] = (code2[node] << 1) + 1 ;
if (arb[node].left != 0)
dfs(arb[node].left) ;
if (arb[node].right != 0)
dfs(arb[node].right) ;
}
int main(int argc, const char * argv[]) {
int codes ; in >> codes ;
for (int i = 1 ; i <= codes ; ++ i) {
in >> id[i] ;
firstQueue.push(i) ;
}
nodes = codes ;
createArb() ;
dfs(nodes) ;
long long lg(0) ;
for (int i = nodes ; i > codes ; -- i) {
lg += id[i] ;
}
out << lg << '\n' ;
for (int i = 1 ; i <= codes ; ++ i) {
out << code[i] << ' ' << code2[i] << '\n' ;
}
}