void bellman_ford(int chosenOne, int nVertices, int* distancia, int nArestas) { int i, j; for (i = 0; i < nVertices; ++i) distancia[i] = INF;//inicializa as distâncias com infinito distancia[chosenOne] = 0;//exceto a do vertice escolhido como inicial, que permanece em 0 for (i = 0; i < nVertices - 1; ++i)//executa laço nVertices-1 vezes for (j = 0; j < nArestas; ++j)//analisando todas as arestas { if (distancia[arestas[j].origem] + arestas[j].peso < distancia[arestas[j].destino] && arestas[j].destino != chosenOne) /*caso a distancia do vertice de origem + o peso da aresta em questão seja menor do que a distancia armazenada no vertice de destino, ocorre a atualizacao no vetor de distancia E a atualizacao na lista de precedentes deste mesmo nó*/ { distancia[arestas[j].destino] = distancia[arestas[j].origem] + arestas[j].peso; limpa_lista(&precedentes[(arestas[j].destino)]); insereEmOrdem(&precedentes[(arestas[j].destino)], &arestas[j].origem, compara_info); } else if(distancia[arestas[j].origem] + arestas[j].peso == distancia[arestas[j].destino]) { insereEmOrdem(&precedentes[(arestas[j].destino)], &arestas[j].origem, compara_info); } } }
void limpa_arvore (arvore r) { if (r == NULL) return; limpa_arvore (r->esq); limpa_arvore (r->dir); limpa_lista (r->list); free (r->str); free (r); }
static void limpa_lista (celula *p) { if (p == NULL) return; limpa_lista (p->prox); free (p); }