-
Notifications
You must be signed in to change notification settings - Fork 0
/
buscaLargura.c
84 lines (69 loc) · 3.08 KB
/
buscaLargura.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <stdio.h>
#include <stdlib.h>
#include "grafo.h"
#include "filaBuscaLargura.c"
// inicializaLargura: Setar todos os vertices como brancos, sem antecessor e distancia infinita
void inicializaLargura(Grafo *grafo, int cor[], int antecessor[], int distancia[]) {
for(int vertice = 0; vertice < grafo->numVertices; vertice++) {
cor[vertice] = BRANCO;
antecessor[vertice] = ANT_INICIO;
distancia[vertice] = INFINITO;
}
}
// buscaLargura: Definimos cor, antecessor distancia e printamos o visitaLargura e Caminhos da BL percorrendo todos os vertices
void buscaLargura(Grafo *grafo) {
int cor[grafo->numVertices], antecessor[grafo->numVertices], distancia[grafo->numVertices];
int inicioComponente;
inicializaLargura(grafo, cor, antecessor, distancia);
fprintf(stdout, "\n\nBL: \n");
for (int vertice = 0; vertice < grafo->numVertices; vertice++) {
if (cor[vertice] == BRANCO) visitaLargura(vertice, grafo, cor, antecessor, distancia);
}
imprimeCaminhoLargura(grafo, distancia, antecessor, inicioComponente);
}
// visitaLargura: Aqui visitamos os vertices de um componente inseridos em uma fila, e mudando cor para cinza quem for branco e preto para quem ja for cinza, atualizando sua distancia e antecessor
void visitaLargura(int inicioComponente, Grafo *grafo, int cor[], int antecessor[], int distancia[]) {
cor[inicioComponente] = CINZA;
distancia[inicioComponente] = DIST_INICIO;
antecessor[inicioComponente] = inicioComponente;
PFILA Fila = inicializarFila();
PITEM retiraPrimeiraFila;
Apontador vAtual;
inserirItem(Fila, inicioComponente);
while(Fila->qtdElementos != 0) {
retiraPrimeiraFila = atendePrimeiro(Fila);
fprintf(stdout, "%d ", retiraPrimeiraFila->idItem);
if(!listaAdjVazia(grafo, retiraPrimeiraFila->idItem)) {
vAtual = grafo->listaAdj[retiraPrimeiraFila->idItem];
while(vAtual != NULL) {
if(cor[vAtual->vdest] == BRANCO) {
cor[vAtual->vdest] = CINZA;
antecessor[vAtual->vdest] = retiraPrimeiraFila->idItem;
distancia[vAtual->vdest] = distancia[retiraPrimeiraFila->idItem] + 1;
inserirItem(Fila, vAtual->vdest);
}
vAtual = vAtual->prox;
}
}
cor[retiraPrimeiraFila->idItem] = PRETO;
}
}
//caminhoLargura: percorre os vertices de um componente
void caminhoLargura(int inicioComponente, int vertice, int antecessor[], int distancia[]) {
if (inicioComponente == vertice) {
fprintf (stdout, "%d ", inicioComponente);
return;
}
if (distancia[vertice] == 0) return;
caminhoLargura(inicioComponente, antecessor[vertice], antecessor, distancia);
fprintf(stdout, "%d ", vertice);
}
//imprimeCaminhoLargura: imprime o caminho feito pela busca em largura
void imprimeCaminhoLargura(Grafo *grafo, int distancia[], int antecessor[], int inicioComponente) {
fprintf(stdout, "\n\nCaminhos BL: \n");
for (int vertice = 0; vertice < grafo->numVertices; vertice++) {
if(distancia[vertice] == DIST_INICIO) inicioComponente = vertice;
caminhoLargura(inicioComponente, vertice, antecessor, distancia);
fprintf(stdout, "\n");
}
}