예제 #1
0
//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;
  }
}
예제 #2
0
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 */