Skip to content

Commit c9344ae

Browse files
committed
commit
1 parent db0a2ca commit c9344ae

File tree

4 files changed

+186
-39
lines changed

4 files changed

+186
-39
lines changed

P09/grafo.c

+147-38
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,31 @@
77
#include "grafo.h"
88

99
/* cria grafo com n vertices */
10-
grafo *grafo_novo(int n)
10+
grafo* grafo_novo(int n)
1111
{
1212
int v;
13-
grafo *g;
13+
grafo* g;
1414

15-
g = (grafo *)malloc(sizeof(grafo));
15+
g = (grafo*)malloc(sizeof(grafo));
1616
g->tamanho = n;
1717

1818
/* cria array de listas de adjacencias */
19-
g->adjacencias = (int **)malloc(n * sizeof(int *));
20-
for (v = 0; v < n; v++)
19+
g->adjacencias = (int**)malloc(n * sizeof(int*));
20+
for(v=0; v<n; v++)
2121
{
22-
g->adjacencias[v] = (int *)calloc(n, sizeof(int));
22+
g->adjacencias[v] = (int*)calloc(n, sizeof(int));
2323
}
2424

2525
return g;
2626
}
2727

2828
/* apaga grafo e liberta memoria */
29-
void grafo_apaga(grafo *g)
29+
void grafo_apaga(grafo* g)
3030
{
31-
if (g == NULL)
31+
if(g == NULL)
3232
return;
3333

34-
if (g->adjacencias != NULL)
34+
if(g->adjacencias != NULL)
3535
{
3636
int v;
3737
for (v = 0; v < g->tamanho; v++)
@@ -46,102 +46,211 @@ void grafo_apaga(grafo *g)
4646
retorna 0 se a aresta ja existir e 1 se foi adicionada */
4747
int grafo_adiciona(grafo *g, int origem, int dest)
4848
{
49-
if (g == NULL || (origem != 0 && origem != 1) || (dest != 0 && dest != 1))
49+
/* alinea 1.1 */
50+
if(!g)
5051
return -1;
51-
if (g->adjacencias[origem][dest])
52-
{
52+
if((origem < 0) || (dest < 0))
53+
return -1;
54+
if((origem > g->tamanho-1) || (dest > g->tamanho-1))
55+
return -1;
56+
57+
if(g->adjacencias[origem][dest])
5358
return 0;
59+
else
60+
{
61+
g->adjacencias[origem][dest] = 1;
62+
return 1;
5463
}
55-
g->adjacencias[origem][dest] = 1;
56-
return 1;
5764
}
65+
5866
/* remove do grafo g a aresta entre os vertices origem e destino
5967
retorna -1 em caso de erro (parametros invalidos)
6068
retorna 0 se a aresta nao existir e 1 se foi removida */
6169
int grafo_remove(grafo *g, int origem, int dest)
6270
{
63-
if (g == NULL || (origem != 0 && origem != 1) || (dest != 0 && dest != 1))
71+
/* alinea 1.1 */
72+
if(!g)
73+
return -1;
74+
if((origem < 0) || (dest < 0))
75+
return -1;
76+
if((origem > g->tamanho-1) || (dest > g->tamanho-1))
6477
return -1;
65-
if (g->adjacencias[origem][dest] == 0)
78+
79+
if(!g->adjacencias[origem][dest])
6680
return 0;
67-
g->adjacencias[origem][dest] = 0;
68-
return 1;
81+
else
82+
{
83+
g->adjacencias[origem][dest] = 0;
84+
return 1;
85+
}
6986
}
7087

7188
/* testa no grafo g a aresta entre os vertices origem e destino
7289
retorna -1 em caso de erro (parametros invalidos)
7390
retorna 0 se a aresta nao existir e 1 se existir */
7491
int grafo_aresta(grafo *g, int origem, int dest)
7592
{
76-
if (g == NULL || (origem != 0 && origem != 1) || (dest != 0 && dest != 1))
93+
/* alinea 1.1 */
94+
if(!g)
7795
return -1;
78-
if (g->adjacencias[origem][dest] == 0)
79-
return 0;
80-
else
81-
return 1;
96+
if((origem < 0) || (dest < 0))
97+
return -1;
98+
if((origem > g->tamanho-1) || (dest > g->tamanho-1))
99+
return -1;
100+
101+
return g->adjacencias[origem][dest];
82102
}
83103

84104
/* cria um novo grafo com base numa lista de adjacencias
85105
parametro adjacencies e' um array de inteiros, representado
86106
um numero n_edges de arestas.
87107
retorna um apontador para o grafo criado */
88-
grafo *grafo_deLista(int *adjacencias, int n_arestas)
108+
grafo* grafo_deLista(int* adjacencias, int n_arestas)
89109
{
90110
/* alinea 1.2 */
111+
if(!adjacencias || (n_arestas < 1))
112+
return NULL;
91113

92-
return NULL;
114+
int tamanho = adjacencias[0];
115+
for(int i = 1; i < 2*n_arestas; i++)
116+
{
117+
if(adjacencias[i] > tamanho)
118+
tamanho = adjacencias[i];
119+
}
120+
tamanho += 1;
121+
122+
grafo *g = grafo_novo(tamanho);
123+
if(!g)
124+
return NULL;
125+
126+
for(int i = 0; i < n_arestas; i++)
127+
{
128+
if(grafo_adiciona(g, adjacencias[2*i], adjacencias[2*i+1]) == -1)
129+
{
130+
grafo_apaga(g);
131+
return NULL;
132+
}
133+
}
134+
return g;
93135
}
94136

95137
/* cria e retorna um vetor de inteiros contendo os vertices
96138
de destino de todas as arestas com origem em i */
97-
vetor *grafo_arestasSaida(grafo *g, int i)
139+
vetor* grafo_arestasSaida(grafo* g, int i)
98140
{
99141
/* alinea 1.3 */
142+
if(!g || (i < 0))
143+
return NULL;
144+
145+
vetor *v = vetor_novo();
146+
if(!v)
147+
return NULL;
148+
149+
// complexidade: O(g->tamanho)
150+
for(int j = 0; j < g->tamanho; j++)
151+
{
152+
if(grafo_aresta(g, i, j))
153+
{
154+
if(vetor_insere(v, j, -1) == -1)
155+
{
156+
vetor_apaga(v);
157+
return NULL;
158+
}
159+
}
160+
}
100161

101-
return NULL;
162+
return v;
102163
}
103164

104165
/* cria e retorna um vetor de inteiros contendo os vertices
105166
de origem de todas as arestas com destino a i */
106-
vetor *grafo_arestasEntrada(grafo *g, int i)
167+
vetor* grafo_arestasEntrada(grafo* g, int i)
107168
{
108169
/* alinea 1.3 */
170+
if(!g || (i < 0))
171+
return NULL;
109172

110-
return NULL;
173+
vetor *v = vetor_novo();
174+
if(!v)
175+
return NULL;
176+
177+
// complexidade: O(g->tamanho)
178+
for(int j = 0; j < g->tamanho; j++)
179+
{
180+
if(grafo_aresta(g, j, i))
181+
{
182+
if(vetor_insere(v, j, -1) == -1)
183+
{
184+
vetor_apaga(v);
185+
return NULL;
186+
}
187+
}
188+
}
189+
190+
return v;
111191
}
112192

113193
/* verifica se o grafo g e' completo
114194
retorna -1 em caso de erro (parametros invalidos)
115195
retorna 1 se o grafo for completo e 0 se nao o for */
116-
int grafo_completo(grafo *g)
196+
int grafo_completo(grafo* g)
117197
{
118198
/* alinea 1.4 */
199+
if(!g)
200+
return -1;
119201

120-
return 0;
202+
// complexidade: O(g->tamanho^2)
203+
for(int i = 0; i < g->tamanho; i++)
204+
{
205+
for(int j = 0; j < i; j++)
206+
{
207+
if(!grafo_aresta(g, i, j) && !grafo_aresta(g, j, i))
208+
return 0;
209+
}
210+
}
211+
return 1;
121212
}
122213

123214
/* verifica se o vertice i do grafo g e' uma celebridade
124215
retorna -1 em caso de erro (parametros invalidos)
125216
retorna 1 se o vertice for uma celebridade e 0 se nao o for */
126-
int grafo_eCelebridade(grafo *g, int i)
217+
int grafo_eCelebridade(grafo* g, int i)
127218
{
128219
/* alinea 1.5 */
220+
if(!g || (i < 0))
221+
return -1;
129222

130-
return 0;
223+
// complexidade: O(n) (onde n = g->tamanho)
224+
for(int j = 0; j < g->tamanho; j++)
225+
{
226+
if(j == i)
227+
continue;
228+
if(grafo_aresta(g, i, j) || !grafo_aresta(g, j, i))
229+
return 0;
230+
}
231+
return 1;
131232
}
132233

133234
/* verifica se o grafo g tem pelo menos uma celebridade
134235
retorna -1 em caso de erro (parametros invalidos)
135236
retorna 1 se existir uma celebridade e 0 se nao existir */
136-
int grafo_temCelebridade(grafo *g)
237+
int grafo_temCelebridade(grafo* g)
137238
{
138239
/* alinea 1.5 */
240+
if(!g)
241+
return -1;
139242

243+
// complexidade: O(n^2) (onde n = g->tamanho)
244+
for(int i = 0; i < g->tamanho; i++)
245+
{
246+
if(grafo_eCelebridade(g, i))
247+
return 1;
248+
}
140249
return 0;
141250
}
142251

143252
/* imprime as adjacencias do grafo */
144-
void grafo_imprime(grafo *g)
253+
void grafo_imprime(grafo* g)
145254
{
146255
int i, j;
147256

@@ -151,11 +260,11 @@ void grafo_imprime(grafo *g)
151260
for (i = 0; i < g->tamanho; i++)
152261
{
153262
printf("%d: ", i);
154-
for (j = 0; j < g->tamanho; j++)
263+
for(j = 0; j < g->tamanho; j++)
155264
{
156-
if (g->adjacencias[i][j] != 0)
265+
if(g->adjacencias[i][j] != 0)
157266
printf("%d ", j);
158267
}
159268
printf("\n");
160269
}
161-
}
270+
}

P09/grafo.o

2.11 KB
Binary file not shown.

P09/teste_grafo

4 KB
Binary file not shown.

P09/teste_grafo.c

+39-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,45 @@ int main()
1010
grafo_apaga(g12);
1111

1212
/* outros testes */
13-
13+
printf("\n");
14+
grafo *g = grafo_deLista(adj, 6);
15+
16+
printf("arestasSaida(1) = {");
17+
vetor *s1 = grafo_arestasSaida(g, 1);
18+
for(int i = 0; i < s1->tamanho; i++)
19+
printf("%d,", vetor_elemento(s1, i));
20+
printf("}\n");
21+
22+
printf("arestasEntrada(5) = {");
23+
vetor *e5 = grafo_arestasEntrada(g, 5);
24+
for(int i = 0; i < e5->tamanho; i++)
25+
printf("%d,", vetor_elemento(e5, i));
26+
printf("}\n");
27+
vetor_apaga(s1);
28+
vetor_apaga(e5);
29+
printf("\n");
30+
31+
printf("g completo: %d\n\n", grafo_completo(g));
32+
grafo_adiciona(g, 0, 1);
33+
printf("aresta 0->1 adicionada\n");
34+
grafo_adiciona(g, 0, 2);
35+
printf("aresta 0->2 adicionada\n");
36+
grafo_adiciona(g, 0, 3);
37+
printf("aresta 0->3 adicionada\n");
38+
grafo_adiciona(g, 0, 4);
39+
printf("aresta 0->4 adicionada\n");
40+
grafo_adiciona(g, 0, 5);
41+
printf("aresta 0->5 adicionada\n");
42+
grafo_adiciona(g, 1, 5);
43+
printf("aresta 1->5 adicionada\n");
44+
grafo_adiciona(g, 2, 3);
45+
printf("aresta 2->3 adicionada\n");
46+
grafo_adiciona(g, 3, 4);
47+
printf("aresta 3->4 adicionada\n");
48+
grafo_adiciona(g, 4, 2);
49+
printf("aresta 4->2 adicionada\n");
50+
grafo_imprime(g);
51+
printf("g completo: %d\n\n", grafo_completo(g));
1452

1553

1654

0 commit comments

Comments
 (0)