-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathL1E060303.c
119 lines (104 loc) · 2.47 KB
/
L1E060303.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
/* Universidade Federal do Espírito Santo - Ufes
Centro Universitário Norte do Espírito Santo - Ceunes
Teoria dos Grafos 2018/1 - TG20181
Lista de exercícios I - Exercício 06
Matriz de adjacência sem desperdício de espaço de memória : Grafo simples não direcionado num vetor único
Data: 30/03/2018
Autor: Elyabe Alves
*/
// #include <bits/stdc++.h>
// using namespace std;
typedef struct grafo
{
int V, E, *adj;
} Grafo;
// Retorna espaço de memória necessária sem desperdício
// n : Número de vértices do grafo
int N( unsigned n )
{
return 0.5*n*(n-1);
}
// Transforma coordenadas bidimensionais em unidimensionais : (u,v) |-> x
// u, v : Coordenadas bidimensionais na matriz de adjacência
// n : Ordem do grafo
unsigned int f( int u, int v, int n )
{
if ( u <= v )
return u*(n-1) - 0.5*u*(u+1) + v - 1;
else
return f( v, u, n );
}
// Cria e retona ponteiro para o grafo
// v : Quantidade de vértices
Grafo *criarGrafo( unsigned int v )
{
Grafo *G = (Grafo*)calloc( 1, sizeof(int) );
if ( G )
{
G -> V = v;
G -> adj = (int*)calloc( N(v), sizeof(int) );
}
return G;
}
// Insere a aresta (u,v) ~ (v, u) no grafo
// G : Ponteiro para grafo
// u, v : Vértices extremidades da aresta
// peso: Peso da aresta
Grafo *inserirAresta( Grafo *G, int u, int v, int peso )
{
int k = f(u,v, G -> V);
if ( u != v && G-> adj[k] == 0)
{
G->adj[k] = peso;
G->E++;
}
return G;
}
// Preenche e retorna um grafo
// E : Quantidade de arestas
Grafo *preencherGrafo( Grafo *G, int E )
{
int v, w, peso;
while ( E--)
{
scanf("%d%d%d", &v, &w, &peso );
G = inserirAresta(G, v, w, peso);
}
return G;
}
// Exibe na tela um grafo
// G : Ponteiro para o grafo em questão
void exibirGrafo( Grafo *G )
{
int k, i, j;
for ( i = 0; i < G -> V; i++ )
{
printf("[%d]-> ", i);
for ( j = 0; j < G -> V; j++ )
{
k = f( i, j, G->V );
if ( i != j && G -> adj[k] != 0 )
printf("(%d | %d) ", j, G->adj[k] );
}
printf("\n");
}
}
// Verifica se vértices são vizinho e o peso da aresta, caso exista
// G : Ponteiro para o grafo
// u, v : Vértices a serem analisados
unsigned int vizinho( Grafo *G, unsigned u, unsigned int v )
{
return G -> adj[f(u,v,G->V)];
}
// Procedimento principal do exercício
void L1E060303_main(void)
{
int u,v, V, E;
Grafo *G;
scanf("%d%d", &V, &E );
G = criarGrafo(V);
G = preencherGrafo( G, E );
exibirGrafo(G);
u = 0, v = 6;
printf("m[f(%d,%d) = %d] = %u \n", u, v, f( u,v, G->V ), vizinho( G, u, v ) );
}