//Função que irá Visitar os vizinhos, enfileirar, desenfileirar de acordo com a cor de cada vértice void VisitaBfs(TipoVertice u, TipoGrafo *Grafo, int **Dist, TipoCor *Cor, int *Antecessor){ TipoVertice v; TipoApontador Aux; short FimListaAdj; TipoPeso Peso; TipoItem Item; TipoFila Fila; Cor[u] = cinza; Dist[u][0] = 0; FFVazia(&Fila); Item.Vertice = u; Item.Peso = 0; Enfileira(Item, &Fila); while (!FilaVazia(Fila)){ Desenfileira(&Fila, &Item); u = Item.Vertice; if (!ListaAdjVazia(&u, Grafo)){ Aux = PrimeiroListaAdj(&u, Grafo); FimListaAdj = FALSE; while (FimListaAdj == FALSE){ ProxAdj(&u, Grafo, &v, &Peso, &Aux, &FimListaAdj); if (Cor[v] == branco){ Cor[v] = cinza; Dist[v][0] = Dist[u][0] + 1; Antecessor[v] = u; Item.Vertice = v; Item.Peso = Peso; Enfileira(Item, &Fila);} } } Cor[u] = preto; } }
void VisitaDfs(int* count, int u, TGraph *Graph, int* Tempo, int* d, int* t, TCor* Cor, short* Antecessor) { short FimListaAdj; TPointer Aux; int v; Cor[u] = CINZA; (*Tempo)++; d[u] = (*Tempo); (*count)++; if (!ListaAdjVazia(&u, Graph)) { Aux = PrimeiroListaAdj(&u, Graph); FimListaAdj = FALSE; while (!(FimListaAdj)) { ProxAdj(&u, Graph, &v, &Aux, &FimListaAdj); if(Cor[v] == BRANCO) { Antecessor[v] = u; VisitaDfs(count, v, Graph, Tempo, d, t, Cor, Antecessor); } } } Cor[u] = PRETO; (*Tempo)++; t[u] = (*Tempo); }
TipoPeso * Dijkstra(TipoGrafo *Grafo, TipoValorVertice *Raiz) { TipoValorVertice * Pos = (TipoValorVertice *) malloc((Grafo->NumVertices+1) * sizeof(TipoValorVertice)); TipoPeso P[Grafo->NumVertices+1]; long * Antecessor = (long *) malloc((Grafo->NumVertices+1) * sizeof(long)); short * Itensheap = (short *) malloc((Grafo->NumVertices+1) * sizeof(short)); int soma = 0; TipoVetor A[Grafo->NumVertices+1]; TipoValorVertice u, v; TipoItem temp; TipoApontador Aux; short FimListaAdj; TipoPeso Peso; for (u = 0; u <= Grafo->NumVertices; u++) { /*Constroi o heap com todos os valores igual a INFINITO*/ Antecessor[u] = -1; P[u] = INFINITO; /*Heap a ser construido*/ A[u+1].Chave = u; Itensheap[u] = TRUE; Pos[u] = u + 1; } n = Grafo->NumVertices; P[*(Raiz)] = 0; Constroi(A, P, Pos); while (n >= 1) { /*enquanto heap nao vazio*/ temp = RetiraMinInd(A, P, Pos); u = temp.Chave; Itensheap[u] = FALSE; if (!ListaAdjVazia(&u, Grafo)) { Aux = PrimeiroListaAdj(&u, Grafo); FimListaAdj = FALSE; while (!FimListaAdj) { ProxAdj(&u, Grafo, &v, &Peso, &Aux, &FimListaAdj); if (P[v] > (P[u] + Peso)) { P[v] = P[u] + Peso; Antecessor[v] = u; DiminuiChaveInd(Pos[v], P[v], A, P, Pos); } } } } free(Pos); free(Antecessor); free(Itensheap); return P; }
void VisitaBfs(TipoValorVertice u, TipoGrafo *Grafo, int *Dist, TipoCor *Cor, int *Antecessor) { TipoValorVertice v; Apontador Aux; short FimListaAdj; TipoPeso Peso; TipoItem Item; TipoFila Fila; Cor[u] = cinza; Dist[u] = 0; FFVazia(&Fila); Item.Vertice = u; Item.Peso = 0; Enfileira(Item, &Fila); printf("Visita origem%2d cor: cinza F:", u); ImprimeFila(Fila); getchar(); while (!FilaVazia(Fila)) { Desenfileira(&Fila, &Item); u = Item.Vertice; if (!ListaAdjVazia(&u, Grafo)) { Aux = PrimeiroListaAdj(&u, Grafo); FimListaAdj = FALSE; while (FimListaAdj == FALSE) { ProxAdj(&u, &v, &Peso, &Aux, &FimListaAdj); if (Cor[v] != branco) continue; Cor[v] = cinza; Dist[v] = Dist[u] + 1; Antecessor[v] = u; Item.Vertice = v; Item.Peso = Peso; Enfileira(Item, &Fila); } } Cor[u] = preto; printf("Visita%2d Dist%2d cor: preto F:", u, Dist[u]); ImprimeFila(Fila); getchar(); } } /* VisitaBfs */