Exemple #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;
  }
}
Exemple #2
0
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);
}
Exemple #3
0
int main()
{
	int vertices, arestas, origem, destino, x, y;
	int count = 0, aux = 0, valid = 0;
	TGraph Graph;

	while(scanf("%d %d", &vertices, &arestas) != EOF)
	{
		aux = 0;
		Graph.NVertices = vertices;
		Graph.NArestas = 0;

		CriaGraph(&Graph);

		for(x = 0; x < arestas; x++)
		{
			scanf("%d %d", &origem, &destino);
			origem--;
			destino--;

			InsereAresta(&origem, &destino, &Graph);
			Graph.NArestas+=2;
		}

		valid = Graph.NVertices;

		for(x = 0; x < Graph.NVertices; x++)
		{
			if(ListaAdjVazia(&x,&Graph))
				valid--;
		}

		for(x = 0; x < Graph.NVertices; x++)
		{
				for(y = 0; y < Graph.NVertices; y++)
				{
					if(Graph.Matrix[x][y] == 1)
					{
						count = 0;

						RetiraAresta(&x, &y, &Graph);
						DFS(&Graph, &count);

						if(count < valid)
							aux++;

						InsereAresta(&x, &y, &Graph);
					}
				}
		}
		fprintf(stdout, "%d\n", (aux/2));
	}
	return 0;
}
Exemple #4
0
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 */