void imprimir_caminho(No_Cidade_Ponteiro n) { if (n->profundidade==0) { printf("%d ", n->id_cidade+1); if (maior_custo < n->custo) { maior_custo = n->custo; } maior_id = n->id_cidade; return; } imprimir_caminho(n->no_pai); printf("-> %d ", n->id_cidade+1); if (maior_custo < n->custo) { maior_custo = n->custo; } return; }
void branch_bound(Graph *graph, No_Cidade_Ponteiro no_temporario) { int i,pos_cidade, custo; No_Cidade_Ponteiro no; if (no_temporario->profundidade == graph->numero_vertices - 1) { if (no_temporario->custo + graph->matriz_adjacencia[no_temporario->id_cidade][0] < melhor_custo) { melhor_custo = no_temporario->custo + graph->matriz_adjacencia[no_temporario->id_cidade][0]; printf("\nNova Solucao Melhor:\n"); imprimir_caminho(no_temporario); printf("-> %d", maior_id+1); printf("\nCusto Total: %d\n", maior_custo+graph->matriz_adjacencia[maior_id][no_temporario->id_cidade]); maior_custo = 0; } free(no_temporario); return; } for (i=1;i<graph->numero_vertices;++i) { pos_cidade = (int) pow(2,i); if ((no_temporario->cidades_visitadas & pos_cidade) != 0) continue; custo = no_temporario->custo + graph->matriz_adjacencia[no_temporario->id_cidade][i]; if (custo > melhor_custo) { if (custo < INFINITO) qtde_podas++; } else { no = (No_Cidade_Ponteiro) malloc(sizeof(struct No_Cidade)); no->id_cidade = i; no->cidades_visitadas = no_temporario->cidades_visitadas | pos_cidade; no->custo = custo; no->profundidade = no_temporario->profundidade +1; no->no_pai = no_temporario; branch_bound(graph, no); } } if (no_temporario) free(no_temporario); return; }
static void montar_caminho(struct bstree *tree, struct bstree *destino) { if (tree != NULL) { if (stack_isfull(caminho)) { char last = stack_pop(caminho); caminho = stack_free(caminho); caminho = stack_new(MAX_CAMINHO); stack_push(caminho, (int) last); } stack_push(caminho, token_para_simbolo(tree->value->token)); if (tree == destino) { imprimir_caminho(); return; } montar_caminho(tree->lchild, destino); montar_caminho(tree->rchild, destino); //(void) stack_pop(caminho); } }