Pagini recente » Cod sursa (job #1969973) | Cod sursa (job #1465155) | Cod sursa (job #2919938) | Cod sursa (job #2615944) | Cod sursa (job #1065754)
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <stdarg.h>
#include <stdio.h>
#include <set>
using namespace std;
//#include <unordered_map>
#define NMAX 1000001
#define INF (1 << 30)
struct nod
{
int value;
int connection[2];
}myArray[NMAX];
int n, viz[NMAX];
long sum, height[NMAX], codes[NMAX];
void DFS (long poz, long cod, long nivel)
{
if ( myArray[poz].connection[0] )
{
DFS (myArray[poz].connection[0], 2 * cod, nivel + 1);
DFS (myArray[poz].connection[1], 2 * cod + 1, nivel + 1);
}
height[poz] = nivel;
codes[poz] = cod;
}
void doTies ()
{
long k = n;
for (int i = n-1; i > 0; i--)
{
++k;
for (int j = 0; j < 2; j++)
{
int min = INF, copy = 0;
for (int z = 1; z < k; z++)
{
if ( myArray[z].value < min && !viz[z] )
{
copy = z;
min = myArray[z].value;
}
}
viz[copy] = 1;
myArray[k].connection[j] = copy;
myArray[k].value += myArray[copy].value;
}
sum += myArray[k].value;
}
DFS (k, 0, 0);
}
int main()
{
FILE *f = fopen ("huffman.in", "r");
FILE *g = fopen ("huffman.out", "w");
fscanf (f, "%d", &n);
for (int i = 1; i <= n; i++)
{
fscanf (f, "%d", &myArray[i].value);
}
doTies();
fprintf (g, "%ld\n", sum);
for (int i = 1; i <= n; i++)
{
fprintf(g, "%ld %ld\n", height[i], codes[i]);
}
fclose(f);
fclose(g);
return 0;
}