Nadesłany przez Marek Rusinowski, 04 lipca 2010 17:41
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
kopiec.h:
/* Copyright 2010 Marek p2004a Rusinowski www.algorytm.org */ #include <cmath> #define MAX true #define MIN false class Heap { unsigned int max_size, size, *data; bool which; void swap(unsigned int index_a, unsigned int index_b) { unsigned int x = data[index_a]; data[index_a] = data[index_b]; data[index_b] = x; } bool cmp(unsigned int index_a, unsigned int index_b) { return which ? ( data[index_a] < data[index_b] ? true : false) : (data[index_a] > data[index_b] ? true : false); } public: // pobiera aktualna wysokosc kopca unsigned int getHeight() { return (unsigned int) floor((log((long double) size) / log((long double) 2)) + 1); } // pobiera aktualny rozmiar kopcac (ilosc elementow) unsigned int getSize() { return size; } // pobiera aktualny maksymalny rozmiar kopca unsigned int getMaxSize() { return max_size; } // konstruktor kopca; // jako parametr max_size okreslamy poczatkowy maksymany rozmiar kopca, w parametrze max okreslamy warunek kopca czyli czy ma byc max (normalny) czy min kopiec Heap(unsigned int max_size, bool max = true); // wstawia element do kopca; // jako parametr value podajemy wartosc nowego elementu // zwraca true jesli sie udalo i false jesli nie (np kopiec pelny) bool insert(unsigned int value); // usowa korzen kopca; // zwraca wartosc usuwanego korzenia unsigned int erase(); // zmienia rozmiar kopca (nowa wartosc moze byc wieksza, moze byc mniejsza); // jako parametr podajemy nowy maksymalny rozmiar kopca // zwraca true jesli sie udalo i false jesli nie (np kopiec zajmuje za duzo i nie da sie zmniejszyc jego maksymalnego rozmiaru na podany) bool resize(unsigned int new_size); };
kopiec.cpp:
/* Copyright 2010 Marek p2004a Rusinowski www.algorytm.org */ #include "kopiec.h" #include <cstring> #include <cstdio> #include <cmath> Heap::Heap(unsigned int ssize, bool max): max_size(ssize), data(new unsigned int [ssize + 2]), size(0), which(max) { memset(data, (max ? 0 : 0xFFFFFFFF) , ssize + 2); } bool Heap::insert(unsigned int value) { if (size == max_size) { return false; } data[size++] = value; for (unsigned int i = size; i != 1; i /= 2) { if (cmp((i / 2) - 1, i - 1)) { swap((i / 2) - 1, i - 1); } else { break; } } return true; } unsigned Heap::erase() { if (size == 0) { return 0; } unsigned value = data[0]; data[0] = data[--size]; unsigned i = 1; while (i * 2 <= size) { register unsigned tmp = cmp((i * 2) - 1, i * 2) ? (i * 2) : (i * 2) - 1; if (cmp(i - 1, tmp)) { swap(i - 1, tmp); i = tmp + 1; } else { break; } } return value; } bool Heap::resize(unsigned new_size) { if (new_size < size) { return false; } max_size = new_size; unsigned *tmp = new unsigned [new_size]; memset(tmp, (which ? 0 : ~0) , new_size); memcpy(tmp, data, size); delete [] data; data = tmp; return true; }