-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrafo.h
175 lines (135 loc) · 5.65 KB
/
grafo.h
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#ifndef _GRAFO_H
#define _GRAFO_H
#include <stdio.h>
#include "lista.h"
//------------------------------------------------------------------------------
// (apontador para) estrutura de dados para representar um grafo
//
// o grafo pode ser
// - direcionado ou não
// - com pesos nas arestas ou não
//
// além dos vértices e arestas, o grafo tem um nome, que é uma "string"
//
// num grafo com pesos nas arestas todas as arestas tem peso, que é um long int
//
// o peso default de uma aresta é 0
typedef struct grafo *grafo;
//------------------------------------------------------------------------------
// devolve o nome do grafo g
char *nome_grafo(grafo g);
//------------------------------------------------------------------------------
// devolve 1, se g é direcionado, ou
// 0, caso contrário
int direcionado(grafo g);
//------------------------------------------------------------------------------
// devolve 1, se g tem pesos nas arestas/arcos,
// ou 0, caso contrário
int ponderado(grafo g);
//------------------------------------------------------------------------------
// devolve o número de vértices do grafo g
unsigned int n_vertices(grafo g);
//------------------------------------------------------------------------------
// devolve o número de arestas/arcos do grafo g
unsigned int n_arestas(grafo g);
//------------------------------------------------------------------------------
// (apontador para) estrutura de dados que representa um vértice do grafo
//
// cada vértice tem um nome que é uma "string"
typedef struct vertice *vertice;
//------------------------------------------------------------------------------
// devolve o nome do vertice v
char *nome_vertice(vertice v);
//------------------------------------------------------------------------------
// lê um grafo no formato dot de input, usando as rotinas de libcgraph
//
// desconsidera todos os atributos do grafo lido exceto o atributo
// "peso" quando ocorrer; neste caso o valor do atributo é o peso da
// aresta/arco que é um long int
//
// num grafo com pesos todas as arestas/arcos tem peso
//
// o peso default de uma aresta num grafo com pesos é 0
//
// todas as estruturas de dados alocadas pela libcgraph são
// desalocadas ao final da execução
//
// devolve o grafo lido ou
// NULL em caso de erro
grafo le_grafo(FILE *input);
//------------------------------------------------------------------------------
// desaloca toda a memória usada em *g
//
// devolve 1 em caso de sucesso ou
// 0 caso contrário
//
// g é um (void *) para que destroi_grafo() possa ser usada como argumento de
// destroi_lista()
int destroi_grafo(void *g);
//------------------------------------------------------------------------------
// escreve o grafo g em output usando o formato dot, de forma que
//
// 1. todos os vértices são escritos antes de todas as arestas/arcos
//
// 2. se uma aresta tem peso, este deve ser escrito como um atributo
// de nome "peso"
//
// devolve o grafo escrito ou
// NULL em caso de erro
grafo escreve_grafo(FILE *output, grafo g);
//------------------------------------------------------------------------------
// devolve um grafo igual a g
grafo copia_grafo(grafo g);
//------------------------------------------------------------------------------
// devolve a vizinhança do vértice v no grafo g
//
// se direcao == 0, v é um vértice de um grafo não direcionado
// e a função devolve sua vizinhanca
//
// se direcao == -1, v é um vértice de um grafo direcionado e a função
// devolve sua vizinhanca de entrada
//
// se direcao == 1, v é um vértice de um grafo direcionado e a função
// devolve sua vizinhanca de saída
lista vizinhanca(vertice v, int direcao, grafo g);
//------------------------------------------------------------------------------
// devolve o grau do vértice v no grafo g
//
// se direcao == 0, v é um vértice de um grafo não direcionado
// e a função devolve seu grau
//
// se direcao == -1, v é um vértice de um grafo direcionado
// e a função devolve seu grau de entrada
//
// se direcao == 1, v é um vértice de um grafo direcionado
// e a função devolve seu grau de saída
unsigned int grau(vertice v, int direcao, grafo g);
//------------------------------------------------------------------------------
// devolve 1, se o conjunto dos vertices em l é uma clique em g, ou
// 0, caso contrário
//
// um conjunto C de vértices de um grafo é uma clique em g
// se todo vértice em C é vizinho de todos os outros vértices de C em g
int clique(lista l, grafo g);
//------------------------------------------------------------------------------
// devolve 1, se v é um vértice simplicial em g, ou
// 0, caso contrário
//
// um vértice é simplicial no grafo se sua vizinhança é uma clique
int simplicial(vertice v, grafo g);
//------------------------------------------------------------------------------
// devolve uma lista de vertices com a ordem dos vértices dada por uma
// busca em largura lexicográfica
lista busca_largura_lexicografica(grafo g);
//------------------------------------------------------------------------------
// devolve 1, se a lista l representa uma
// ordem perfeita de eliminação para o grafo g ou
// 0, caso contrário
//
// o tempo de execução é O(|V(G)|+|E(G)|)
int ordem_perfeita_eliminacao(lista l, grafo g);
//------------------------------------------------------------------------------
// devolve 1, se g é um grafo cordal ou
// 0, caso contrário
int cordal(grafo g);
#endif