Estruturas matemáticas representadas por nós e vértices
Autor(es): Pedro Henrique Paiola, Rene Pegoraro, Wilson M Yonezawa, Arissa Yoshida, Nicolas Barbosa Gomes, Luis Henrique Morelli
𝐺 = (𝑉, 𝐴)
V = {1, 2, 3, 4, 5}
A = {(1,2), (1,3), (2, 1), (2, 4), (3,5), (4, 3), (4, 5), (5, 5)}
1 é adjacente à 2 e 2 é adjacente à 1
3 é adjacente à 1, mas 1 não é adjacente à 3
5 é adjacente a ele mesmo (laço)
𝐺 = (𝑉, 𝐴)
V = {1, 2, 3, 4, 5}
A = {(1,2), (1,3), (2,4), (3,4), (4,5)}
𝑔𝑟𝑎𝑢 𝑣 =número de arestas que incidem em 𝑣
𝑔𝑟𝑎𝑢 𝑣 = 𝑔𝑟𝑎𝑢_𝑒𝑛𝑡𝑟𝑎𝑑𝑎 𝑣 + 𝑔𝑟𝑎𝑢_𝑠𝑎í𝑑𝑎(𝑣)
em que
𝑔𝑟𝑎𝑢_𝑒𝑛𝑡𝑟𝑎𝑑𝑎 𝑣 = número de arestas que entram em 𝑣
𝑔𝑟𝑎𝑢_𝑠𝑎í𝑑𝑎 𝑣 = número de arestas que saem em 𝑣
(1, 3, 5)
2, 4, 3
1, 2, 4, 3, 5
1, 2, 4, 5
(1, 2, 4, 3, 1)
Para um grafo de 𝑛 vértices, podemos utilizar uma matriz 𝑀𝑛×𝑛.
𝑀𝑖,𝑗 = 1 ↔ 𝑗 é adjacente a 𝑖.
𝑀[i][i] = 1 se há uma aresta do nó 𝑖 ao nó 𝑗.
𝑀[i][i] = 0 se não há uma aresta do nó 𝑖 ao nó 𝑗.
Quando o grafo é não direcionado, a matriz é simétrica.
Para grafos ponderados, a matriz de adjacência pode ser utilizada para armazenar os pesos das arestas (desde que não haja peso nulo).
Confira a GIF abaixo:
typedef struct{
int v; //vértice adjacente
int w; //peso
} TAdj;
vector<TAdj> adj[MAX_V]; //Lista de adjacência
int grau[MAX_V]; //número de arestas do vértice
void initGrafo(int qtdeVertices){
memset(grau, 0, sizeof(grau));
for(int i = 0; i < qtdeVertices; i++)
adj[i].clear();
}
//Cria aresta de a para b, com peso w
void aresta(int a, int b, int w){
TAdj aux;
aux.v = b;
aux.w = w;
grau[a]++;
adj[a].push_back(aux);
//Se o grafo for não orientado, também adicionamos a aresta (b, a) co
m peso w
}
Generalização da busca em profundidade em árvores.
Dado um grafo 𝐺 e um nó inicial 𝑠, a estratégia é explorar o grafo em profundidade, visitando as arestas do vértice mais recentemente descoberto que levam a vértices ainda inexplorados.
Implementação: recursiva ou iterativa com auxílio de pilha.
Complexidade: 𝑂(𝑉 + 𝐴) para lista de adjacência e 𝑂(𝑉2) para matriz de adjacência.
Possíveis usos: encontrar caminhos, contagem de componentes conexas e detecção de ciclos.
Pseudo-código:
DFS(𝑣)
Marcar 𝑣 como visitado
Para cada vértice 𝑢 adjacente à 𝑣
Se 𝑢 não foi visitado
DFS(𝑢)
int visitado[MAX_V];
int p[MAX_V];
int ordemVis;
void initDfs(){
memset(visitado, 0, sizeof(visitado));
memset(p, -1, sizeof(p));
ordemVis = 0;
}
void dfs(int s){
visitado[s] = ++ordemVis;
for(auto t : adj[s]){
if (visitado[t.v] == 0){
p[t.v] = s;
dfs(t.v);
}
}
}
Generalização da busca em largura em árvores.
Dado um grafo 𝐺 e um nó inicial 𝑠, a estratégia é explorar o grafo por “nível”. Vamos definir nível de 𝑣 como sendo o comprimento do menor caminho do vértice inicial até 𝑣.
Implementação: iterativa com auxílio de fila.
Complexidade: 𝑂(𝑉 + 𝐴) para lista de adjacência e 𝑂(𝑉2) para matriz de adjacência.
Possíveis usos: encontrar o menor caminho (em número de arestas) entre vértices.
Pseudo-código:
BFS(𝑣)
Enfileirar 𝑣 na fila 𝑄
Enquanto 𝑄 não estiver vazia
Desenfileirar o vértice 𝑢 de 𝑄
Marcar 𝑢 como visitado
Para cada vértice 𝑤 adjacente à 𝑢
Se 𝑤 ainda não foi visitado
Enfileirar 𝑤 na fila Q
int d[MAX_V]; //armazena a distância do nó inicial até cada nó i
void bfs(int inicio)
{
int s, t;
queue<int> Q;
memset(visitado, 0, sizeof(visitado));
memset(p, -1, sizeof(p));
d[inicio] = 0;
visitado[inicio] = ++ordemVis;
Q.push(inicio);
while(!Q.empty()){
s = Q.front();
Q.pop();
for(auto t : adj[s]){
if (visitado[t] == 0){
visitado[t] = ++ordemVis;
d[t] = d[s] + 1;
p[t] = s;
Q.push(t);
}
}
}
}
![img30][img30.png]
1 2
1 3
4 5
5 6
4 6
Gravações de LPC I e II – 2020:
Aulas de Estrutura de Dados II da Profª Drª Marcia Aparecida Zanoli Meira e Silva.
Matemática Discreta e Suas Aplicações. Kenneth H. Rosen.
Seminário sobre Introdução a Teoria dos Grafos. Davi Neves, Giovani Candido, Luis Morelli e Luiz Sementille.
Biblioteca de códigos de Thiago Alexandre Domingues de Souza.
http://www.lcad.icmc.usp.br/~jbatista/scc210/Aula_Grafos1.pdf
http://www.lcad.icmc.usp.br/~jbatista/scc210/Aula_Grafos2.pdf
http://www4.pucsp.br/~jarakaki/grafos/Aula2.pdf
https://miltonborba.org/Algf/Grafos.htm
https://www.ime.usp.br/~pf/algoritmos_para_grafos/aulas/graphs.html
https://www.obm.org.br/content/uploads/2017/01/Nivel1_grafos_bruno.pdf