06 Grafos

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 105

Vanessa Braganholo

GRAFOS E DIGRAFOS Estruturas de Dados e Seus


Algoritmos
GRAFOS
Definições
1
Representação
Algoritmos
­ Busca
­ Inserção (arestas e vértices)
4 2
­ Exclusão (arestas e vértices)

5 3 6
GRAFOS
Grafos são estruturas de dados formadas por um conjunto de vértices e um conjunto
de arestas.

1
arestas

4 2

vértices
5 3 6
INSTITUTO DE COMPUTAÇÃO - UFF 3
APLICAÇÕES DE GRAFOS
Associando-se significados aos vértices e às arestas, o grafo passa a constituir um
modelo de uma situação ou informação real

1
arestas

4 2

vértices
5 3 6
GRADE CURRICULAR

INSTITUTO DE COMPUTAÇÃO - UFF 5


ROTAS
DE VOOS

INSTITUTO DE COMPUTAÇÃO - UFF 6


Fonte da imagem: https://www.aviacaocomercial.net/rotastam.htm
INTERNET (MAPA DE CABOS SUBMARINOS)

INSTITUTO DE COMPUTAÇÃO - UFF 7


Fonte da imagem: https://mhemann.com.br/wp-content/uploads/2017/07/mapacabossubmarinos.jpg
MAPA DE
ESTRADAS

INSTITUTO DE COMPUTAÇÃO - UFF 8


Fonte da imagem: http://www.sp-turismo.com/mapa.htm
MAPA DE
METRÔ

INSTITUTO DE COMPUTAÇÃO - UFF 9


REDES SOCIAIS

INSTITUTO DE COMPUTAÇÃO - UFF 10


Fonte da imagem: https://thenextweb.com/contributors/2017/08/21/blockchain-can-make-social-networks-private-profitable/
PROCESSOS/TAREFAS

INSTITUTO DE COMPUTAÇÃO - UFF 11


Fonte da imagem: https://www.softwareadvice.com/resources/what-is-critical-path/
DEPENDÊNCIAS EM SOFTWARE
Cada vértice é um arquivo de um sistema de software
Cada arco é uma dependência: um arquivo v é construído a partir de todos os
arquivos w para os quais existe um arco da forma (v,w)
­ O utilitário make do UNIX trabalha sobre grafos deste tipo
OUTRAS APLICAÇÕES
Cada vértice é uma página na internet. Cada arco é um link que leva de uma
página a outra.
Os vértices são times de futebol e os arcos são os jogos entre os times durante um
campeonato.
Os vértices são as casas de um tabuleiro de xadrez. Há um arco de x para y se
uma peça do jogo pode ir de x a y em um só movimento.
GRAFOS – DEFINIÇÕES
DEFINIÇÃO FORMAL
Um grafo G é representado por um
conjunto (não vazio) V de vértices e um 1
conjunto (possivelmente vazio) E de
arestas (edges)
G = (V, E)
|V| é a quantidade de vértices de G 4 2
|E| é a quantidade de arestas de G

5 3 6
GRAFOS ORIENTADOS X NÃO ORIENTADOS
As arestas podem ter uma direção ou podem ser bi-direcionais
Grafos orientados: as arestas possuem uma direção
­ Também são chamados de grafos dirigidos ou digrafos

Grafos não orientados: as arestas são bi-direcionais (se existe uma conexão a → b
então também existe uma conexão b → a)

INSTITUTO DE COMPUTAÇÃO - UFF 16


GRAFO ORIENTADO (DIRIGIDO OU DIGRAFO)
Arestas possuem uma direção
Alguns autores usam o termo arco para as arestas de um grafo dirigido
Exemplo: 1
G = (V, E)
V = {1, 2, 3, 4, 5}
5 2
E = {(1, 5), (2, 3), (2, 4), (3, 2), (4, 3), (5, 2), (5, 4)}

4 3
INSTITUTO DE COMPUTAÇÃO - UFF 17
GRAFO ORIENTADO (DIRIGIDO OU DIGRAFO)
Arestas possuem uma direção
Alguns autores usam o termo arco para as arestas de um grafo dirigido
Exemplo: 1
G = (V, E)
V = {1, 2, 3, 4, 5}
5 2
E = {(1, 5), (2, 3), (2, 4), (3, 2), (4, 3), (5, 2), (5, 4)}

4 3
INSTITUTO DE COMPUTAÇÃO - UFF 18
GRAFO ORIENTADO (DIRIGIDO OU DIGRAFO)
Exemplos:
­ Malha de transporte urbano
­ Pessoa A segue pessoa B no Instagram (mas o contrário nem
1
sempre é verdadeiro)

5 2

4 3
INSTITUTO DE COMPUTAÇÃO - UFF 19
GRAFO NÃO ORIENTADO
Arestas são bi-direcionais
G = (V, E)
1
V = {1, 2, 3, 4, 5, 6}
E = {{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4},
{2, 6}, {3, 5}, {4, 5}, {4, 6}, {6, 2}} 4 2

5 3 6
INSTITUTO DE COMPUTAÇÃO - UFF 20
GRAFO NÃO ORIENTADO
Arestas são bi-direcionais
G = (V, E)
1
V = {1, 2, 3, 4, 5, 6}
E = {{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4},
{2, 6}, {3, 5}, {4, 5}, {4, 6}, {6, 2}} 4 2

5 3 6
INSTITUTO DE COMPUTAÇÃO - UFF 21
GRAFO NÃO ORIENTADO
Exemplo:
­ Amigos no Facebook (se A é amigo de B, B 1
também é amigo de A)
­ Mapa de cabeamento de uma rede (se é
possível enviar dados do ponto A ao ponto
B, então também é possível enviar do
ponto B ao ponto A) 4 2

5 3 6
INSTITUTO DE COMPUTAÇÃO - UFF 22
GRAFOS ORIENTADOS X NÃO ORIENTADOS
Um grafo expressa uma relação binária R
Grafo não orientado
­ {v1, v2} ∈ G(E) ⇔ v1 R v2 ^ v2 R v1
­ Exemplo: R = amigo no Facebook

Grafo orientado
­ (v1, v2) ∈ G(E) ⇔ v1 R v2
­ Exemplo: R = seguir alguém no Instagram

INSTITUTO DE COMPUTAÇÃO - UFF 23


DEFINIÇÕES E TERMINOLOGIA
Um grafo é valorado se possuir valores 1
(pesos) associados às arestas e/ou aos 19 9
vértices
Exemplo: num grafo de rotas de voo, 6 7 2
uma aresta pode ser valorada com a 17 15
distância entre os dois aeroportos que 8 23
ela conecta
5 4 3

INSTITUTO DE COMPUTAÇÃO - UFF 24


DEFINIÇÕES E TERMINOLOGIA
Um vértice v1 é adjacente a um vértice v2 em G, se existe uma aresta conectando
v1 a v2 em G.
Em grafo não orientado: v1 é adjacente a v2 se existe aresta {v1,v2} (nesse caso
v2 também é adjacente a v1)
Em grafo orientado, v1 é adjacente a v2 se existe aresta (v1, v2)

Grafo não-orientado Grafo orientado

v1 v2 v1 v2 v1 v2

adjacência é
simétrica adjacência não é simétrica
INSTITUTO DE COMPUTAÇÃO - UFF 25
DEFINIÇÕES E TERMINOLOGIA
Dados dois vértices adjacentes v1 e v2
Em um grafo orientado, uma aresta (v1, v2) é incidente de (sai de) v1 e é incidente
a (entra em) v2

v1 v2

Em um grafo não orientado, uma aresta {v1, v2} é incidente em v1 e v2

v1 v2

INSTITUTO DE COMPUTAÇÃO - UFF 26


DEFINIÇÕES E TERMINOLOGIA
O grau de um vértice é o número de arestas que nele/dele incidem

v1 v8

v2 v3 v4

v5 v6 v7

INSTITUTO DE COMPUTAÇÃO - UFF 27


DEFINIÇÕES E TERMINOLOGIA
O grau de um vértice é o número de arestas que nele/dele incidem

2
0
v1 v8
Vértices com grau 0 são
4 4
ditos vértices isolados
v2 v3 v4 4

v5 v6 v7 3
4
3

INSTITUTO DE COMPUTAÇÃO - UFF 28


DEFINIÇÕES E TERMINOLOGIA
A ordem de um grafo é o número de vértices que ele possui
G = (V, E)
ordem(G) = |V| v1 v8

v2 v3 v4

v5 v6 v7

INSTITUTO DE COMPUTAÇÃO - UFF 29


DEFINIÇÕES E TERMINOLOGIA
O caminho de tamanho k entre dois vértices v1 e v2 é a sequencia <v0, v1, …,
vk>, onde v0 = v1, vk = v2, e (vi-1, vi) Î G(E) (ou {vi-1, vi} Î G(E)) para i=1..k
O caminho contém os vértices v0, v1, …, vk, e as arestas (v0, v1), (v1, v2), … (vk-1, vk)
(ou {v0, v1}, {v1, v2}, … {vk-1, vk} para grafos não orientados)
Exemplo:
­ Caminho de tamanho 1 entre os vértices 1 e 3:
1
­ Vértices: {1, 3}
­ Arestas: {{1, 3}} 4 2
­ Caminho de tamanho 2 entre os vértices 1 e 3:
­ Vértices: {1, 2, 3}
­ Arestas: {{1, 2}, {2, 3}}
5 3
INSTITUTO DE COMPUTAÇÃO - UFF 30
DEFINIÇÕES E TERMINOLOGIA
Se existe um caminho entre v1 e v2, diz-se que v2 é alcançável a partir de v1
O caminho é simples se todos os vértices no caminho são distintos
Exemplo:
­ 3 é alcançável a partir de 4 1
­ 2 não é alcançável a partir de 1
4 2

5 3

INSTITUTO DE COMPUTAÇÃO - UFF 31


DEFINIÇÕES E TERMINOLOGIA
Um grafo é dito conectado se existe um caminho ligando cada par de vértices

Conectado Não Conectado


v1 v1

v2 v3 v2 v3

v4 v5 v4 v5
INSTITUTO DE COMPUTAÇÃO - UFF 32
DEFINIÇÕES E TERMINOLOGIA
Um grafo é dito completo se todos os seus pares de vértices forem adjacentes

v1

v2 v3

v4 v5
INSTITUTO DE COMPUTAÇÃO - UFF 33
DEFINIÇÕES E TERMINOLOGIA
Uma aresta que tem ambas as extremidades em um mesmo vértice é chamada laço

v1

INSTITUTO DE COMPUTAÇÃO - UFF 34


DEFINIÇÕES E TERMINOLOGIA
Um caminho <v0, v1, …, vk> forma um ciclo se v0 = vk e o caminho contém pelo
menos uma aresta
Exemplo: caminho de v1 a v1
v1

v2 v3

v4 v5
INSTITUTO DE COMPUTAÇÃO - UFF 35
DEFINIÇÕES E TERMINOLOGIA
Um grafo sem ciclos é dito acíclico

v1 v1 v1

v2 v3 v2 v3 v2 v3

Cíclico Acíclico Acíclico

v4 v5 v4 v5 v4 v5

INSTITUTO DE COMPUTAÇÃO - UFF 36


DEFINIÇÕES E TERMINOLOGIA
Um grafo é dito simétrico se para cada aresta (v, w) existe uma aresta (w, v)

v1 v2 v1 v2

v3 v4 v3 v4

INSTITUTO DE COMPUTAÇÃO - UFF 37


GRAFOS – REPRESENTAÇÕES
INSTITUTO DE COMPUTAÇÃO - UFF 38
REPRESENTAÇÃO FÍSICA DE GRAFOS
Matriz de adjacência
Matriz de incidência
Lista de adjacência
Lista de incidência

INSTITUTO DE COMPUTAÇÃO - UFF 39


REPRESENTAÇÃO FÍSICA DE GRAFOS
Matriz de adjacência
Matriz de incidência
Lista de adjacência
Lista de incidência

INSTITUTO DE COMPUTAÇÃO - UFF 40


MATRIZ DE ADJACÊNCIA
Matriz de adjacência A(n x n) de um grafo G de ordem n, é uma
matriz onde cada elemento ai,j é:
­ Grafos orientados:
­ ai,j = 1 se (vi,vj) Î G(E)
­ ai,j = 0 se (vi,vj) Ï G(E)
­ Grafos não orientados: ai,j = aj,i
­ ai,j = 1 se {vi,vj} Î G(E)
­ ai,j = 0 se {vi,vj} Ï G(E)
MATRIZ DE ADJACÊNCIA
A matriz de adjacência é uma forma de representação de grafos simples, econômica
e adequada para muitos problemas que envolvem apenas a estrutura do grafo
vértices
2 3

vértices
1 2 3 4 5 6
1 0 1 0 1 0 1
2 0 0 1 1 0 0
3 0 0 0 0 0 0
1 4
4 0 0 1 0 1 0
5 0 0 0 1 0 1
6 0 1 0 1 0 0

6 5
MATRIZ DE ADJACÊNCIA PARA
GRAFO NÃO ORIENTADO
2
1 2 3 4
1 0 1 1 0
1 2 1 0 1 1
4 3 1 1 0 1
4 0 1 1 0

3
MATRIZ DE ADJACÊNCIA PARA
GRAFO NÃO ORIENTADO
2
1 2 3 4
1 0 1 1 0
1 2 0 1 1
4 3 0 1
4 0

3 Matriz é simétrica
MATRIZ DE ADJACÊNCIA PARA GRAFOS
VALORADOS
Valores associados às linhas podem ser representados por uma extensão simples da
Matriz de Adjacência
­ aij = k se (vi,vj) Î G(E)
1
­ aij = * se (vi,vj) Ï G(E) 19 9 1 2 3 4 5 6
1 * 9 * 7 * 19
2 9 * 23 15 * *
6 7 2
3 * 23 * 27 * *
17 15
8 4 7 15 27 * 30 17
23
5 * * * 30 * 8
6 19 * * 17 8 *
5 4 3
30 27
MATRIZ DE ADJACÊNCIA
Matriz binária: ocupa pouco espaço, especialmente para grafos grandes
Manipulação simples: recursos para manipular matrizes existem em qualquer
linguagem de programação
Fácil determinar se (vi,vj) Î G(E)
Fácil determinar vértices adjacentes a um determinado vértice v
Quando o grafo é não orientado, a MA é simétrica (mais econômica)
Inserção de novas arestas é fácil
Inserção de novos vértices é muito difícil

INSTITUTO DE COMPUTAÇÃO - UFF 46


REPRESENTAÇÃO FÍSICA DE GRAFOS
Matriz de adjacência
Matriz de incidência
Lista de adjacência
Lista de incidência

INSTITUTO DE COMPUTAÇÃO - UFF 47


MATRIZ DE INCIDÊNCIA
É uma matriz B(n x m), sendo n o número de vértices, m o número de arestas e:
­ bij= -1 se o vértice i é a origem da aresta j
­ bij= 1 se o vértice i é o término da aresta j
­ bij = 0 se aresta (i,j) Ï G(E)

Para grafos não orientados, bij= 1 se a aresta j é incidente ao vértice i.


2 arestas
a1 a4

vértices
a1 a2 a3 a4 a5
1 -1 -1 0 0 0
1 a3
4 2 1 0 -1 -1 0
a2 3 0 1 1 0 -1
a5 4 0 0 0 1 1
3 INSTITUTO DE COMPUTAÇÃO - UFF 48
REPRESENTAÇÃO FÍSICA DE GRAFOS
Matriz de adjacência
Matriz de incidência
Lista de adjacência
Listas de incidência

INSTITUTO DE COMPUTAÇÃO - UFF 49


LISTA DE ADJACÊNCIA
Para cada vértice v é representada a lista de vértices u tais que (v,u) Î G(E)
Possíveis formas de armazenamento: vetores, vetores + listas encadeadas, listas
encadeadas
Melhor forma de representação: listas encadeadas G
­ Uso racional do espaço
­ Flexibilidade 1 2 3 /
2
1 2 3 4 /
4
3 4 /
3
4 / /
INSTITUTO DE COMPUTAÇÃO - UFF 50
LISTAS DE ADJACÊNCIA
Nós podem ser estendidos para representar outras informações

G
2
1 1 ? 2 ? 3 ? /
4
2 ? 3 ? 4 ? /

3
3 ? 4 ? /

4 ? / /

INSTITUTO DE COMPUTAÇÃO - UFF 51


REPRESENTAÇÃO FÍSICA DE GRAFOS
Matriz de adjacência
Matriz de incidência
Lista de adjacência
Lista de incidência

INSTITUTO DE COMPUTAÇÃO - UFF 52


LISTAS DE INCIDÊNCIA

2
1
4

G 1 2 1 3 2 3 2 4 3 4 /

INSTITUTO DE COMPUTAÇÃO - UFF 53


IMPLEMENTAÇÃO
Veremos a implementação de grafos usando lista de adjacência
­ São flexíveis para acomodar inserções e remoções, ao contrário das matrizes de adjacência e
incidência
­ Facilitam a identificação dos vértices do grafo, ao contrário das listas de incidência

INSTITUTO DE COMPUTAÇÃO - UFF 54


2
1
ESTRUTURA EM C 4

3
typedef struct vizinho {
int id_vizinho; G
struct vizinho *prox;
}TVizinho; TVizinho
1 2 3 /

TGrafo
typedef struct grafo{
int id_vertice; 2 3 4 /
TVizinho *prim_vizinho;
struct grafo *prox; 3 4 /
}TGrafo;
4 / /

INSTITUTO DE COMPUTAÇÃO - UFF 55


INICIALIZAÇÃO DA ESTRUTURA
TGrafo *inicializa(){
return NULL;
}

INSTITUTO DE COMPUTAÇÃO - UFF 56


IMPRESSÃO DO GRAFO
void imprime(TGrafo *g){
while(g != NULL){
printf("Vértice %d\n", g->id_vertice);
printf("Vizinhos: ");
TVizinho *v = g->prim_vizinho;
while(v != NULL){
printf("%d ", v->id_vizinho);
v = v->prox;
}
printf("\n\n");
g = g->prox;
}
}

INSTITUTO DE COMPUTAÇÃO - UFF 57


IMPRESSÃO DO GRAFO
(IMPLEMENTAÇÃO RECURSIVA)
void imprime_recursivo(TGrafo *g){
if(g != NULL){
printf("Vértice: %d:\n", g->id_vertice);
printf("Vizinhos: ");
TVizinho *v = g->prim_vizinho;
while(v){
printf("%d ", v->id_vizinho);
v = v->prox;
}
printf("\n\n");
imprime_recursivo(g->prox);
}
}
INSTITUTO DE COMPUTAÇÃO - UFF 58
LIBERAÇÃO DA ESTRUTURA
void libera(TGrafo *g){
while(g != NULL){
libera_vizinhos(g->prim_vizinho);
TGrafo *temp = g;
g = g->prox;
free(temp);
}
}
void libera_vizinhos(TVizinho *v){
while(v != NULL){
TVizinho *temp = v;
v = v->prox;
free(temp);
}
}

INSTITUTO DE COMPUTAÇÃO - UFF 59


LIBERAÇÃO DA ESTRUTURA
(IMPLEMENTAÇÃO RECURSIVA)
void libera_recursivo(TGrafo *g){
if(g != NULL){
libera_vizinho_recursivo(g->prim_vizinho);
libera_recursivo(g ->prox);
free(g);
}
}
void libera_vizinho_recursivo(TVizinho *v){
if(v != NULL) {
libera_vizinho_recursivo(v->prox);
free(v);
}
}

INSTITUTO DE COMPUTAÇÃO - UFF 60


GRAFOS – ALGORITMOS BÁSICOS
INSTITUTO DE COMPUTAÇÃO - UFF 61
2

BUSCA 1
4

3
Busca por um vértice v1
­ Basta percorrer a lista de vértices até encontrar v1
G
Busca por uma aresta (v1, v2) TVizinho
­ Percorrer a lista de vértices até encontrar v1
1 2 3 /

TGrafo
­ Depois percorrer a lista de vizinhos de v1 até encontrar v2

2 3 4 /

3 4 /

4 / /

INSTITUTO DE COMPUTAÇÃO - UFF 62


BUSCA POR VÉRTICE X
TGrafo* busca_vertice(TGrafo* g, int x){
while((g != NULL) && (g->id_vertice != x)) {
g = g->prox;
}
return g;
}

INSTITUTO DE COMPUTAÇÃO - UFF 63


BUSCA POR ARESTA (V1, V2) OU {V1, V2}
TVizinho* busca_aresta(TGrafo *g, int v1, int v2){
TGrafo *pv1 = busca_vertice(g,v1);
TGrafo *pv2 = busca_vertice(g,v2);
TVizinho *resp = NULL;
//checa se ambos os vértices existem
if((pv1 != NULL) && (pv2 != NULL)) {
//percorre a lista de vizinhos de v1 procurando por v2
resp = pv1->prim_vizinho;
while ((resp != NULL) && (resp->id_vizinho != v2)) {
resp = resp->prox;
}
}
return resp;
}

INSTITUTO DE COMPUTAÇÃO - UFF 64


INSERÇÃO DE VÉRTICE
Insere o vértice na lista encadeada de vértices, como primeiro vértice da lista
Exemplo: inserir vértice 4 G

1 2 3 /
2
1 2 3 /

3 / /
3

INSTITUTO DE COMPUTAÇÃO - UFF 65


INSERÇÃO DE VÉRTICE
Insere o vértice na lista encadeada de vértices, como primeiro vértice da lista
Exemplo: inserir vértice 4 G

4 /
2
1 1 2 3 /
4
2 3 /
3
3 / /

INSTITUTO DE COMPUTAÇÃO - UFF 66


INSERÇÃO DE VÉRTICE
TGrafo *insere_vertice(TGrafo *g, int x){
TGrafo *p = busca_vertice(g, x);
if(p == NULL){
p = (TGrafo*) malloc(sizeof(TGrafo));
p->id_vertice = x;
p->prox = g;
p->prim_vizinho = NULL;
g = p;
}
return g;
}

INSTITUTO DE COMPUTAÇÃO - UFF 67


INSERÇÃO DE ARESTA
Grafo não orientado (digrafo)
­ Inserção de aresta {v1, v2}: inserir v2 na lista de vizinhos de v1, e v1 na lista de vizinhos de v2 (ou
seja, inserir as arestas (v1, v2) e (v2, v1))

Grafo orientado
­ Inserção de aresta (v1, v2): inserir v2 na lista de vizinhos de v1

Em ambos os casos, verificar se a aresta já existe antes de realizar a inserção

INSTITUTO DE COMPUTAÇÃO - UFF 68


INSERÇÃO DE ARESTA EM
GRAFO NÃO ORIENTADO
Exemplo: Inserir aresta {2, 4}
G

4 /
2
1 1 2 3 /
4
2 1 /
3
3 / 1 /

INSTITUTO DE COMPUTAÇÃO - UFF 69


INSERÇÃO DE ARESTA EM
GRAFO NÃO ORIENTADO
Exemplo: Inserir aresta {2, 4}
G

4 2
2
1 1 2 3 /
4
2 4 1 /
3
3 / 1 /

INSTITUTO DE COMPUTAÇÃO - UFF 70


INSERÇÃO DE ARESTA EM
GRAFO NÃO ORIENTADO
void insere_um_sentido(TGrafo *g, int v1, int v2){
TGrafo *p = busca_vertice(g, v1);
TVizinho *nova = (TVizinho *) malloc(sizeof(TVizinho));
nova->id_vizinho = v2;
nova->prox = p->prim_vizinho;
p->prim_vizinho = nova;
}
void insere_aresta(TGrafo *g, int v1, int v2){
TVizinho *v = busca_aresta(g, v1, v2);
if(v == NULL)
insere_um_sentido(g, v1, v2); Se grafo é não orientado,
insere_um_sentido(g, v2, v1); usar essa função
}

INSTITUTO DE COMPUTAÇÃO - UFF 71


INSERÇÃO DE ARESTA EM DIGRAFO
Exemplo: Inserir aresta (2, 4)
G

4 /
2
1 1 2 3 /
4
2 3 /
3
3 / /

INSTITUTO DE COMPUTAÇÃO - UFF 72


INSERÇÃO DE ARESTA EM DIGRAFO
Exemplo: Inserir aresta (2, 4)
G

4 /
2
1 1 2 3 /
4
2 4 3 /
3
3 / /

INSTITUTO DE COMPUTAÇÃO - UFF 73


INSERÇÃO DE ARESTA EM DIGRAFO
void insere_aresta_digrafo(TGrafo *g, int v1, int v2){
TVizinho *v = busca_aresta(g, v1, v2);
if(v == NULL) {
insere_um_sentido(g, v1, v2);
}
}

INSTITUTO DE COMPUTAÇÃO - UFF 74


EXCLUSÃO DE ARESTA
Grafo não orientado (digrafo)
­ Exclusão de aresta {v1, v2}: excluir v2 da lista de vizinhos de v1, e v1 da lista de vizinhos de v2 (ou
seja, excluir as arestas (v1, v2) e (v2, v1))

Grafo orientado
­ Exclusão de aresta (v1, v2): excluir v2 da lista de vizinhos de v1

Em ambos os casos, liberar a memória

INSTITUTO DE COMPUTAÇÃO - UFF 75


EXCLUSÃO DE ARESTA EM
GRAFO NÃO ORIENTADO
Exemplo: exclusão da aresta {2, 3}
G

4 2
2
1 1 2 3 /
4
2 3 4 1 /
3
3 / 1 2 /

INSTITUTO DE COMPUTAÇÃO - UFF 76


EXCLUSÃO DE ARESTA EM
GRAFO NÃO ORIENTADO
Exemplo: exclusão da aresta {2, 3}
G

4 2
2
1 1 2 3 /
4
2 3 4 1 /
3
3 / 1 2 /

INSTITUTO DE COMPUTAÇÃO - UFF 77


EXCLUSÃO DE ARESTA EM
GRAFO NÃO ORIENTADO
Exemplo: exclusão da aresta {2, 3}
G

4 2
2
1 1 2 3 /
4
2 4 1 /
3
3 / 1 /

INSTITUTO DE COMPUTAÇÃO - UFF 78


EXCLUSÃO DE ARESTA EM
GRAFO NÃO ORIENTADO
void retira_um_sentido(TGrafo *g, int v1, int v2){
TGrafo *p = busca_vertice(g, v1);
if(p != NULL) {
TVizinho *ant = NULL;
TVizinho *atual = p->prim_vizinho;
while ((atual) && (atual->id_vizinho != v2)) {
ant = atual;
atual = atual->prox;
}
if (ant == NULL) //v2 era o primeiro nó da lista
p->prim_vizinho = atual->prox;
else
ant->prox = atual->prox;
free(atual);
}
}
INSTITUTO DE COMPUTAÇÃO - UFF 79
EXCLUSÃO DE ARESTA EM
GRAFO NÃO ORIENTADO (CONT.)
void retira_aresta(TGrafo *g ,int v1, int v2){
TVizinho* v = busca_aresta(g,v1,v2);
if(v != NULL) {
retira_um_sentido(g, v1, v2);
retira_um_sentido(g, v2, v1);
}
}

INSTITUTO DE COMPUTAÇÃO - UFF 80


EXCLUSÃO DE ARESTA EM DIGRAFO
Exemplo: Exclusão de aresta (2, 3)
G

1 2 3 /
2
1 2 3 4 /
4
3 4 /

3
4 / /

INSTITUTO DE COMPUTAÇÃO - UFF 81


EXCLUSÃO DE ARESTA EM DIGRAFO
Exemplo: Exclusão de aresta (2, 3)
G

1 2 3 /
2
1 2 3 4 /
4
3 4 /

3
4 / /

INSTITUTO DE COMPUTAÇÃO - UFF 82


EXCLUSÃO DE ARESTA EM DIGRAFO
Exemplo: Exclusão de aresta (2, 3)
G

1 2 3 /
2
1 2 4 /
4
3 4 /

3
4 / /

INSTITUTO DE COMPUTAÇÃO - UFF 83


EXCLUSÃO DE ARESTA EM DIGRAFO
void retira_aresta_digrafo(TGrafo *g ,int v1, int v2){
TVizinho* v = busca_aresta(g,v1,v2);
if(v != NULL) {
retira_um_sentido(g, v1, v2);
}
}

INSTITUTO DE COMPUTAÇÃO - UFF 84


EXCLUSÃO DE VÉRTICE
G
Exclui
­ vértice 1 2 3 /
­ sua lista de vizinhos
­ todos os vizinhos que tinham esse vértice como extremidade
2 3 4 /
Libera memória
3 4 /

4 / /

INSTITUTO DE COMPUTAÇÃO - UFF 85


EXCLUSÃO DE VÉRTICE EM
GRAFO NÃO ORIENTADO
Exemplo: exclusão do vértice 2
G

4 2
2
1 1 2 3 /
4
2 4 1 /
3
3 / 1 /

INSTITUTO DE COMPUTAÇÃO - UFF 86


EXCLUSÃO DE VÉRTICE EM
GRAFO NÃO ORIENTADO
Retira todos os vizinhos de 2
­ Retira vizinho 4
G

4 2
2
1 1 2 3 /
4
2 4 1 /
3
3 / 1 /

INSTITUTO DE COMPUTAÇÃO - UFF 87


EXCLUSÃO DE VÉRTICE EM
GRAFO NÃO ORIENTADO
Retira todos os vizinhos de 2
­ Retira vizinho 4
G

4 /
2
1 1 2 3 /
4
2 1 /
3
3 / 1 /

INSTITUTO DE COMPUTAÇÃO - UFF 88


EXCLUSÃO DE VÉRTICE EM
GRAFO NÃO ORIENTADO
Retira todos os vizinhos de 2
­ Retira vizinho 1
G

4 /
2
1 1 2 3 /
4
2 1 /
3
3 / 1 /

INSTITUTO DE COMPUTAÇÃO - UFF 89


EXCLUSÃO DE VÉRTICE EM
GRAFO NÃO ORIENTADO
Retira todos os vizinhos de 2
­ Retira vizinho 1
G

4 /
2
1 1 3 /
4
2 /
3
3 / 1 /

INSTITUTO DE COMPUTAÇÃO - UFF 90


EXCLUSÃO DE VÉRTICE EM
GRAFO NÃO ORIENTADO
Retira vértice 2
G

4 /
2
1 1 3 /
4
2 /
3
3 / 1 /

INSTITUTO DE COMPUTAÇÃO - UFF 91


EXCLUSÃO DE VÉRTICE EM
GRAFO NÃO ORIENTADO
Retira vértice 2
G

4 /

1 1 3 /
4

3
3 / 1 /

INSTITUTO DE COMPUTAÇÃO - UFF 92


EXCLUSÃO DE VÉRTICE EM
GRAFO NÃO ORIENTADO
TGrafo *retira_vertice(TGrafo *g, int v){
TGrafo *p = g;
TGrafo *ant = NULL;
while((p != NULL) && (p->id_vertice != v)){
ant = p;
p = p->prox;
}
if(p != NULL) {
while (p->prim_vizinho != NULL)
retira_aresta(g, v, p->prim_vizinho->id_vizinho);
if (ant == NULL)
g = g->prox;
else
ant->prox = p->prox;
free(p);
}
return g;
}

INSTITUTO DE COMPUTAÇÃO - UFF 93


EXCLUSÃO DE VÉRTICE EM DIGRAFO
G
Exemplo: exclusão do vértice 2
1 2 3 /

2 3 4 /

3 4 /
2
1 4 / /
4

INSTITUTO DE COMPUTAÇÃO - UFF 94


EXCLUSÃO DE VÉRTICE EM DIGRAFO
G
Retira todos os vizinhos de 2
1 2 3 /

2 3 4 /

3 4 /
2
1 4 / /
4

INSTITUTO DE COMPUTAÇÃO - UFF 95


EXCLUSÃO DE VÉRTICE EM DIGRAFO
G
Retira 2 da lista de vizinhos dos outros nós
1 2 3 /

2 /

3 4 /
2
1 4 / /
4

INSTITUTO DE COMPUTAÇÃO - UFF 96


EXCLUSÃO DE VÉRTICE EM DIGRAFO
G
Retira vértice 2
1 3 /

2 /

3 4 /
2
1 4 / /
4

INSTITUTO DE COMPUTAÇÃO - UFF 97


EXCLUSÃO DE VÉRTICE EM DIGRAFO
G
Retira vértice 2
1 3 /

3 4 /

1 4 / /
4

INSTITUTO DE COMPUTAÇÃO - UFF 98


EXCLUSÃO DE VÉRTICE EM
DIGRAFO
Exercício: escreva uma função em C para exclusão de vértice em grafo orientado
­ TGrafo *retira_vértice_digrafo(TGrafo *g, int v);

INSTITUTO DE COMPUTAÇÃO - UFF 99


ALGORITMOS EM GRAFOS
Existem diversos algoritmos eficientes para encontrar caminhos em grafos
­ Eles serão aprendidos na disciplina de Algoritmos em Grafos (6º. Semestre)

Aqui na disciplina faremos exercícios procurando por caminhos e resolvendo


pequenos problemas em estruturas de grafos, para motivar o uso de grafos e o
aprendizado dos algoritmos na disciplina de Algoritmos em Grafos

INSTITUTO DE COMPUTAÇÃO - UFF 100


EXERCÍCIOS
Considere o grafo a seguir, que representa seguidores no Instagram. Cada pessoa
tem nome e idade (nome é o id do vértice). Uma aresta (v1, v2) significa que v1
segue v2 no Instagram.

Ana 23 Felipe 20

Marcos 19
João 25 Jane 30

Renata 35

Caio 20 Pedro 20 Bruna 23 INSTITUTO DE COMPUTAÇÃO - UFF 101


EXERCÍCIOS
Implementar funções em C para responder às seguintes questões:
1. Quantas pessoas uma determinada pessoa segue?
int numero_seguidos(TGrafo *g, char *nome);

2. Quem são os seguidores de uma determinada pessoa? (função imprime os nomes


dos seguidores, caso a flag imprime seja True, e retorna quantidade de
seguidores)
int seguidores(TGrafo *vertice, char *nome, int imprime);

3. Quem é a pessoa mais popular? (tem mais seguidores)


TGrafo *mais_popular(TGrafo *g);

INSTITUTO DE COMPUTAÇÃO - UFF 102


EXERCÍCIOS
4. Quais são as pessoas que só seguem pessoas mais velhas do que ela própria?
(função imprime os nomes das pessoas, caso a flag imprime seja True, e retorna
quantidade de pessoas)
int segue_mais_velho(TGrafo *g, int imprime);

INSTITUTO DE COMPUTAÇÃO - UFF 103


REFERÊNCIA
Celes, W.; Cerqueira, R.; Rangel, J.L. Introdução a Estruturas de Dados com
Técnicas de Programação em C, 2a. ed. Elsevier. Cap. 22

INSTITUTO DE COMPUTAÇÃO - UFF 104


AGRADECIMENTOS
Material baseado nos slides de Renata Galante, UFRGS
Implementação em C baseada no material de Isabel Rosseti, UFF

INSTITUTO DE COMPUTAÇÃO - UFF 105

Você também pode gostar