Pagini recente » Cod sursa (job #1615743) | Cod sursa (job #489068) | Cod sursa (job #991356) | Cod sursa (job #1043932) | Cod sursa (job #2907047)
#include<bits/stdc++.h>
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("mergeheap.in");
ofstream fout("mergeheap.out");
const int NMAX = 101;
const int INF = 2000000001;
int N, M;
// Heap structure
struct HeapNode {
int key;
HeapNode *leftChild;
HeapNode *nextSibling;
HeapNode():
leftChild(NULL), nextSibling(NULL) {}
// creates a new node
HeapNode(int key_, HeapNode *leftChild_, HeapNode *nextSibling_):
key(key_), leftChild(leftChild_), nextSibling(nextSibling_) {}
// Adds a child and sibling to the node
void addChild(HeapNode *node) {
if(leftChild == NULL)
leftChild = node;
else {
node->nextSibling = leftChild;
leftChild = node;
}
}
};
// Returns true if root of the tree
// is null otherwise returns false
bool Empty(HeapNode *node) {
return (node == NULL);
}
// Function to merge two heaps
HeapNode *Merge(HeapNode *A, HeapNode *B)
{
// If any of the two-nodes is null
// the return the not null node
if(A == NULL) return B;
if(B == NULL) return A;
// To maintain the min heap condition compare
// the nodes and node with minimum value become
// parent of the other node
if(A->key < B->key) {
A->addChild(B);
return A;
}
else {
B->addChild(A);
return B;
}
return NULL; // Unreachable
}
// Returns the root value of the heap
int Top(HeapNode *node) {
return node->key;
}
// Function to insert the new node in the heap
HeapNode *Insert(HeapNode *node, int key) {
return Merge(node, new HeapNode(key, NULL, NULL));
}
// This method is used when we want to delete root node
HeapNode *TwoPassMerge(HeapNode *node) {
if(node == NULL || node->nextSibling == NULL)
return node;
else {
HeapNode *A, *B, *newNode;
A = node;
B = node->nextSibling;
newNode = node->nextSibling->nextSibling;
A->nextSibling = NULL;
B->nextSibling = NULL;
return Merge(Merge(A, B), TwoPassMerge(newNode));
}
return NULL; // Unreachable
}
// Function to delete the root node in heap
HeapNode *Delete(HeapNode *node) {
return TwoPassMerge(node->leftChild);
}
struct PairingHeap {
HeapNode *root;
PairingHeap():
root(NULL) {}
bool Empty(void) {
return ::Empty(root);
}
int Top(void) {
return ::Top(root);
}
void Insert(int key) {
root = ::Insert(root, key);
}
void Delete(void) {
root = ::Delete(root);
}
void Join(PairingHeap other) {
root = ::Merge(root, other.root);
}
};
PairingHeap Heap[NMAX];
// Driver Code
int main()
{
fin >> N >> M;
int task, h, x, h1, h2;
for( int i = 1; i <= M; ++i ){
fin >> task;
if( task == 1 ){
fin >> h >> x;
Heap[h].Insert( x );
}
if( task == 2 ){
fin >> h;
fout << Heap[h].Top() << '\n';
Heap[h].Delete();
}
if( task == 3 ){
fin >> h1 >> h2;
Heap[h1].Join( Heap[h2] );
}
}
return 0;
}