Exemple #1
0
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);
            }
        }
}
Exemple #2
0
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);
}
Exemple #3
0
static void limpa_lista (celula *p) {
    if (p == NULL) return;
    limpa_lista (p->prox);
    free (p);
}