示例#1
0
 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;
 }
示例#2
0
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;
}; 
示例#3
0
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;
}; 
示例#4
0
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;
}