Pagini recente » Cod sursa (job #2770992) | Cod sursa (job #329157) | Cod sursa (job #1890637) | Cod sursa (job #677082) | Cod sursa (job #2620826)
//
// 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] ;
std::pair <int, long long> code[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} ;
// std::cout << nodes << " " << x << ' ' << y << '\n' ;
}
void createArb() {
while (firstQueue.size() + secondQueue.size() >= 2) {
int smallest = small() ;
int help = small() ;
// std::cout << smallest << " " << help << " " << nodes + 1 << '\n' ;
addNode(smallest, help) ;
}
}
void dfs(int node) {
code[arb[node].left].level = code[node].level + 1 ;
code[arb[node].right].level = code[node].level + 1 ;
code[arb[node].left].cod = code[node].cod << 1 ;
code[arb[node].right].cod = (code[node].cod << 1) + 1 ;
// std::cout << arb[node].left << " " << code[arb[node].left].left << " " << code[arb[node].left].right << '\n' ;
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) ;
// for (int i = nodes ; i >= 1 ; -- i) {
// std::cout << i << " -> " << code[i].left << " " << code[i].right << '\n' ;
// }
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].level << ' ' << code[i].cod << '\n' ;
}
}