void FibHeap<Key, Data, Compare>::erase (Node* node){ if (node==nullptr) throw logic_error("There is no node to erase."); decrease_key(node, root->key); root = node; Node* temp = extract_minimum(); delete temp; }
DijkstraResult* dijkstra(Graph *graph, int source){ DijkstraResult* dijkstra_result; MinPriorityQueue min_priority_queue; int u; dijkstra_result = allocate_memory_dijkstra(graph->numbers_nodes); allocate_memory(&min_priority_queue, graph->numbers_nodes); initialize(dijkstra_result, &min_priority_queue, source, graph->numbers_nodes); build_min_heap(&min_priority_queue); while(lenght(&min_priority_queue) > 0){ u = extract_minimum(&min_priority_queue); for(int v = 0; v < graph->numbers_nodes; v++) relax(dijkstra_result, &min_priority_queue, graph, u, v); } return dijkstra_result; };
DijkstraResult* dijkstra(Graph *graph, int source){ DijkstraResult* dijkstra_result; int *nodes2Visit; int u; dijkstra_result = allocate_memory_dijkstra(graph->numbers_nodes); nodes2Visit = (int*)malloc(sizeof(int) * graph->numbers_nodes); initialize(dijkstra_result,nodes2Visit, source, graph->numbers_nodes); while(exist_node2visit(nodes2Visit, graph->numbers_nodes)){ u = extract_minimum(nodes2Visit, graph->numbers_nodes); for(int v = 0; v < graph->numbers_nodes; v++) relax(dijkstra_result, nodes2Visit, graph, u, v); nodes2Visit[u] = NODE_NOT_VISITED; } return dijkstra_result; };
int main() { int *a; int heap_size = 0; char ch, buffer[512]; int key, index, min, size; printf("Enter size of the priority queue: "); fgets(buffer, 511, stdin); sscanf(buffer, "%d", &size); a = (int *) malloc(sizeof(int) * size); do { printf("1> Enter i to insert a number in priority queue\n"); printf("2> Enter c to delete a number from priority queue\n"); printf("3> Enter d to decrease key\n"); printf("4> Enter g to see minimum value in priority queue\n"); printf("5> Enter m to retrieve maximum value in priority queue\n"); printf("6> Enter p to print the priority queue\n"); printf("7> Enter e to exit\n"); fgets(buffer, 511, stdin); sscanf(buffer, "%c", &ch); switch(ch) { case 'i': if(heap_size < size) { printf("Enter the key to insert: "); fgets(buffer, 511, stdin); sscanf(buffer, "%d", &key); insert(a, key, &heap_size); printf("Key inserted successfully\n"); } else printf("Priority queue overflow\n"); break; case 'c': printf("Enter index to delete: "); fgets(buffer, 511, stdin); sscanf(buffer, "%d", &index); if(delete(a, index, &heap_size) != -1) printf("Key deleted successfully\n"); break; case 'd': printf("Enter index to be decrease: "); fgets(buffer, 511, stdin); sscanf(buffer, "%d", &index); printf("Enter new key less than the previous: "); fgets(buffer, 511, stdin); sscanf(buffer, "%d", &key); decrease_key(a, index, key, heap_size); printf("Key decreased successfully\n"); break; case 'g': min = minimum(a, heap_size); if(min != -1) printf("Minimum value in priority queue = %d\n", min); break; case 'm': min = extract_minimum(a, &heap_size); if(min != -1) printf("Minimum value in priority queue = %d\n", min); break; case 'p': print_priority_queue(a, heap_size); break; case 'e': printf("Exiting\n"); break; default: printf("Try again\n"); break; } } while(ch != 'e'); return 1; }