forked from kelvins/algorithms-and-data-structures
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Grafos.c
125 lines (108 loc) · 2.72 KB
/
Grafos.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
*
*
* ---------------------
* | |
* | |
* 5 V 8 |
* (A)------------->(B)------------ | 2
* \ | |
* \ | |
* \ 6 4 V |
* ---------->(C)--------->(D)------
*
*
*/
#include <stdio.h>
#include <malloc.h>
#define MAX_VERTICES 20 // Constante que define o máximo de vertices que o grafo pode ter
int nroVertices = 0; // Guarda o número de vértices atual
int matriz[MAX_VERTICES][MAX_VERTICES]; // Matriz de Distancia
int componentes;
typedef struct NO{
char id;
int nroVizinhos;
struct AUX* vizinhos[];
bool visitado;
int indice; // Guarda a ordem em que o vértice foi criado
}*VERTICE;
typedef struct AUX{
VERTICE vizinho;
int valor;
}*ARESTA;
VERTICE criaVertice(char id){
matriz[nroVertices][nroVertices] = 0;
VERTICE novo = (VERTICE) malloc( sizeof(NO) );
novo->id = id;
novo->nroVizinhos = 0;
novo->visitado = false;
novo->indice = nroVertices;
nroVertices++;
return novo;
}
void ligaVertice(VERTICE v1, VERTICE v2, int valor){
matriz[v1->indice][v2->indice] = valor;
ARESTA nova = (ARESTA) malloc( sizeof(AUX) );
nova->vizinho = v2;
nova->valor = valor;
v1->vizinhos[v1->nroVizinhos] = nova;
v1->nroVizinhos++;
}
void mostraMatrizDistancia(){
printf("\nMatriz de Distancia\n");
for(int l = 0; l < nroVertices; l++){
for(int c = 0; c < nroVertices; c++){
if( matriz[l][c] == -1 )
printf("%d, ", matriz[l][c]);
else
printf(" %d, ", matriz[l][c]);
}
printf("\n");
}
printf("\n");
}
void zeraVariaveis(){
for(int l = 0; l < MAX_VERTICES; l++){
for(int c = 0; c < MAX_VERTICES; c++){
matriz[l][c] = -1;
}
}
}
void visitaVizinhos(bool visitados[], int atual){
for (int i = 0; i < nroVertices; i++){
if( visitados[i] == false && matriz[atual][i] > 0 ){
visitados[i] = true;
componentes++;
visitaVizinhos(visitados, i);
}
}
}
void calculaComponentesConexos(){
bool visitados[nroVertices];
for (int i = 0; i < nroVertices; ++i){
visitados[i] = false;
}
for (int i = 0; i < nroVertices; i++){
if( visitados[i] == false ){
visitaVizinhos(visitados, i);
}
}
}
int main(){
zeraVariaveis();
// Matriz de Distância funciona conforme a ordem inserida
VERTICE A = criaVertice('A');
VERTICE B = criaVertice('B');
VERTICE C = criaVertice('C');
VERTICE D = criaVertice('D');
VERTICE E = criaVertice('E');
ligaVertice(A, B, 5);
ligaVertice(A, C, 6);
ligaVertice(B, D, 8);
ligaVertice(C, D, 4);
ligaVertice(D, B, 2);
calculaComponentesConexos();
printf("\nComponentes Conexos: %d\n", componentes) ;
mostraMatrizDistancia();
return 0;
}