Cod sursa(job #474157)

Utilizator mlazariLazari Mihai mlazari Data 2 august 2010 16:57:40
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<fstream>
#include<queue>

using namespace std;

#define NMAX 1000003
#define ll long long

ifstream fi("huffman.in");

struct Nod {
  ll v;
  int f[2];
} nod[NMAX<<1];

queue<int> q;
int n,i,id,nod1,nod2;
int lg[NMAX];
ll cod[NMAX];
ll lgtot;

int nodMin() {
  int rez;
  if(q.empty()) return id++;
  rez=q.front();
  if(id==n) {
    q.pop();
    return rez;
  }
  if(nod[id].v<nod[rez].v) return id++;
  q.pop();
  return rez;
}

void uneste(int nod1, int nod2, int nodRez) {
  nod[nodRez].f[0]=nod1;
  nod[nodRez].f[1]=nod2;
  nod[nodRez].v=nod[nod1].v+nod[nod2].v;
  q.push(nodRez);
}

void asociazaCod(int nrnod,ll nrcod,int lung) {
  if(nrnod>=n) {
    lgtot+=nod[nrnod].v;
    asociazaCod(nod[nrnod].f[0],nrcod<<1,lung+1);
    asociazaCod(nod[nrnod].f[1],1+(nrcod<<1),lung+1);
    return;
  }
  cod[nrnod]=nrcod;
  lg[nrnod]=lung;
}

int main() {
  fi>>n;
  for(i=0;i<n;i++) fi>>nod[i].v;
  for(i=n;i<=2*n-2;i++) {
    nod1=nodMin();
    nod2=nodMin();
    uneste(nod1,nod2,i);
  }
  asociazaCod(2*n-2,0,0);
  freopen("huffman.out","w",stdout);
  printf("%lld\n",lgtot);
  for(i=0;i<n;i++) printf("%d %lld\n",lg[i],cod[i]);
  return 0;
}