Estrutura de Dados
Tema 8: Grafos e suas Aplicações
Área de segurança para intérprete de Libras.
É uma estrutura formada por um conjunto de não vazio de vértices (ou nós) e por um conjunto de arestas (ou arcos), ligando estes vértices.
O que é um Grafo?
A
B C
D
Área de segurança para intérprete de Libras.
No grafo a seguir temos o seguintes conjuntos:
O que é um Grafo?
V = {A, B, C, D, E}
A = {(A,A), (A,B), (A, B), (A,C), (B,D), (B,E), (C,E)}
A
B C
D E
Área de segurança para intérprete de Libras.
Seja G um grafo onde V é o conjunto dos vértices e A é o conjunto das arestas.
Afirmar que A contém a aresta v-w, é o mesmo que afirmar que A contém a aresta w-v (com v e w V).
O que é um Grafo?
Área de segurança para intérprete de Libras.
• Um grafo é simples (ou regular) se não possuir laços e nem mais de uma aresta ligando dois vértices.
Definições importantes
A B C D E Grafo simples A B C D E MultigrafoÁrea de segurança para intérprete de Libras.
• A vizinhança de um nó é definida assim: N(v) = {w V | v-w A}.
Nestes casos podemos dizer que o vértice w é adjacente a v e que a aresta v-w incide no vértice v.
Definições importantes
A B C D E N(A) = {B, C, E}Área de segurança para intérprete de Libras.
• O grau de um vértice é a quantidade de arestas que incidem nele.
• Um vértice é dito isolado se possuir grau zero.
Definições importantes
G(A) = 3 G(B) = 2 G(C) = 1 G(D) = 3 G(E) = 2 G(F) = 0 A B C D E FÁrea de segurança para intérprete de Libras.
• Um grafo completo com n vértices é um grafo simples onde existe uma aresta ligando todo par não ordenado vértices distintos.
• O número máximo de arestas em um grafo com n vértices é n * (n-1) /2.
Definições importantes
A B C D EÁrea de segurança para intérprete de Libras.
• Um grafo não precisa ser uma árvore, mas toda árvore é um grafo.
Definições importantes
A B C D E A B C D E árvore Não árvoreÁrea de segurança para intérprete de Libras.
• Um grafo pode ser representado por uma matriz N x N, onde N é a quantidade de vértices de um grafo.
Representação de um grafo
A B C D A 0 1 1 0 B 1 0 1 1 C 1 1 0 0 D 0 1 0 1 A B C DÁrea de segurança para intérprete de Libras.
• Há grafos que possuem pesos associados às arestas. Assim, o peso é armazenado no matriz.
Representação de um grafo
A B C D A 5 3 B 5 2 8 C 3 2 D 8 9 A B C D 3 2 5 8 9Continuando
Área de segurança para intérprete de Libras.
Quando as arestas possuem sentido, dizemos que o grafo é orientado (ou dígrafo). Nestes casos, cada aresta é representada por um par ordenado <nó_origem, nó_destino>.
Desta forma, a aresta v-w não é igual a aresta w-v.
Grafo orientado (ou dígrafo)
A C
Exemplo:
aresta A-C possui A como cabeça da seta e C como terminação da seta.
Área de segurança para intérprete de Libras.
Dígrafo (digraph = directed graph)
V = {A, B, C, D, E, F}
A = {<A,B>, <B,A>, <B,C>, <B,E>, <C,A>, <C,D>, <E,F>, <F,E>, <F,A>}
A B F E D C
Área de segurança para intérprete de Libras.
Grau dos vértices em um dígrafo
Em um dígrafo um vértice n (com n V) possui: grau de entrada: número de arestas que têmn como cabeça da seta (origem da seta) grau de saída: número
de arestas que têm n como terminação da seta (destino da seta)
Área de segurança para intérprete de Libras.
Grau dos vértices em um dígrafo
grau do vértice: número de arestas queincidem em n (soma do grau de entrada com o grau de saída).
Um dígrafo com n vértices é considerado completo se possuir a quantidade máxima de arestas, ou seja, é n * (n-1).
Área de segurança para intérprete de Libras.
Dígrafo (digraph = directed graph)
A B F E D C Vértice A: grau de entrada: 3 grau de saída: 1 grau: 4 Vértice B: grau de entrada: 1 grau de saída: 3 grau: 4 Vértice D: grau de entrada: 1 grau de saída: 0 grau: 1
Área de segurança para intérprete de Libras.
Relações representadas através de grafos
Uma relação R num conjunto A é uma sequencia de pares ordenados de elementos de A.R = { (a;b) | a A b B P(a,b) é verdadeira}
Área de segurança para intérprete de Libras.
Relações representadas através de grafos
Exemplo: Seja V = {3, 4, 5,6} e R: V V, {(x,y), com x e y V | x < y } R = {<3, 4><3, 5><3,6><4,5><4,6><5,6>} 3 4 6 5Área de segurança para intérprete de Libras.
Relações representadas através de grafos
É possível associar um valor a cada aresta pertencente à relação. Assim, tem-se um grafo orientado e valorado. 3 4 6 5 2 1 7 11 8 5Área de segurança para intérprete de Libras.
Relações representadas através de grafos
Exemplo: Sejam V o conjuntos dos vértices de um grafo G, R a relação definida e A o conjunto de arestas (<x,y>, peso) obtidos com a relação R. R: V V, {(x,y), com x e y V | x > y} V = {1, 4, 7, 8} peso = x - y R = {(<4, 1>, 3) (<7, 1>,6) (<7,4>,3) (<8,1>,7) (<8,4>,4) (<8,7>,1)}Área de segurança para intérprete de Libras.
Relações representadas através de grafos
V = {1, 4, 7, 8} e R = {(<4, 1>, 3) (<7, 1>,6) (<7,4>,3) (<8,1>,7) (<8,4>,4) (<8,7>,1)} 1 4 8 7 3 6 3 7 4 1Área de segurança para intérprete de Libras.
• Um dígrafo pode ser representado por uma matriz N x N, onde N é a quantidade de vértices.
Representação de um dígrafo
A B C D A 0 0 1 0 B 1 0 1 0 C 0 0 0 0 D 0 1 0 1 A B C DÁrea de segurança para intérprete de Libras. • Há dígrafos que possuem pesos associados às arestas. Assim, o peso é armazenado no matriz.
Representação de um dígrafo
1 4 7 8 1 4 3 7 6 3 8 7 4 1 1 4 8 3 6 7 4 1Agora é sua Vez
Tema 8:Grafos e suas Aplicações
Área de segurança para intérprete de Libras. Considerando o grafo ao
lado, responda: Qual o grau de cada Vértice?
Exercitando...
1 2 3 4 6 5 7Área de segurança para intérprete de Libras. É um grafo simples? É um grafo completo?
Exercitando...
1 2 3 4 6 5 7Área de segurança para intérprete de Libras. Quantos caminhos existem
entre os vértices 3 e 5?
O grafo possui algum ciclo?
O grafo possui alguma aresta cuja remoção o tornaria um grafo acíclico?
Exercitando...
1 2 3 4 6 5 7Área de segurança para intérprete de Libras. Represente graficamente os seguintes grafos: Um grafo simples com 3 vértices (todos com grau 2).
Exercitando...
Área de segurança para intérprete de Libras. b) Um grafo de 5 vértices, com ciclos de tamanho 1, 3 e 4.
c) Um grafo completo com 6 vértices.
Área de segurança para intérprete de Libras.
Exercitando...
Observe o dígrafo ao lado e responda:
Qual o grau de cada vértice? 1 2 3 4 5 7
Área de segurança para intérprete de Libras.
Exercitando...
Qual deveria ser o grau dos vértices para que o dígrafo pudesse ser considerado completo? 1 2 3 4 5 7
Área de segurança para intérprete de Libras.
Exercitando...
Desenhe um dígrafo correspondente à relação abaixo, considerando:
V = {1,2,3}
R: {<x,y>, com x e Y V | x*y seja múltiplo de 3}
Área de segurança para intérprete de Libras. V={1, 2, 3} x y x*y 1 1 1 1 2 2 1 3 3 V 2 1 2 2 2 4 2 3 6 V 3 1 3 V 3 2 6 V 3 3 9 V 1 2 3
Área de segurança para intérprete de Libras. Matriz de adjacência 1 2 3 1 0 0 1 2 0 0 1 3 0 1 1 1 2 3
Finalizando
Área de segurança para intérprete de Libras.
Um caminho de comprimento k do vértice a até o vértice b é definido como uma sequência de k+1 vérticesn1,n2, ..., nk+1, tal que n1= a e nk+1= b. Um caminho de um nó até ele mesmo é chamado
ciclo.
Se o grafo possuir um ciclo ele é chamado cíclico. Caso contrário, ele é chamado acíclico, ou dag (directed acyclic graph)
Caminho entre vértices
Área de segurança para intérprete de Libras.
No grafo ao lado existem:
um caminho de tamanho 1 de C até F; um caminho de tamanho 3 de C até A
(C-D-B-A);
um caminho de tamanho 5 de C até A (C-F-E-D-B-A); um ciclo de A para A, de E
para E, ...;
não existe um caminho de F para C;
...
Caminho entre vértices
BD E
C
F A
Área de segurança para intérprete de Libras.
Matriz de adjacência:
Caminho entre vértices
B D E C F A A B C D E F A 0 0 0 1 0 0 B 1 0 0 0 1 0 C 0 0 0 1 0 1 D 0 1 0 0 1 1 E 0 0 0 1 0 0 F 0 0 0 0 1 0
Área de segurança para intérprete de Libras. #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define TAM 6
void iniciarGrafo(int mat[][TAM]) { int i, j;
for (i=0; i<TAM; i++) for (j=0; j<TAM; j++)
mat[i][j] = 0; }
Área de segurança para intérprete de Libras.
void join(int mat[][TAM], int cidade1, int cidade2) { mat[cidade1][cidade2]=1;
}
int adjacente(int mat[][TAM], int cidade1, int cidade2) {
if (mat[cidade1][cidade2]) return 1;
else return 0; }
Área de segurança para intérprete de Libras.
int procuraCaminho(int mat[][TAM], int cidade1, int cidade2, int k) { if (k ==1) {
if (adjacente(mat, cidade1, cidade2)) return 1;
else return 0; }
Área de segurança para intérprete de Libras.
for (int c=0; c<TAM; ++c) if (adjacente(mat, cidade1, c) &&
procuraCaminho(mat, c, cidade2, k-1)) return 1;
return 0; }
Área de segurança para intérprete de Libras.
int main() {
int matriz[TAM][TAM];
int cidade1, cidade2, k, temCaminho; char resp='S', caminho[30]="\0"; iniciarGrafo(matriz); while (toupper(resp) == 'S') { do { printf("Digite origem: "); scanf("%i", &cidade1); } while (cidade1 <1 || cidade1 >TAM);
Área de segurança para intérprete de Libras.
do {
printf("Digite destino: "); scanf("%i", &cidade2);
} while (cidade2 <1 || cidade2 >TAM); printf("Realizar outro join? "); join(matriz, cidade1-1, cidade2-1); fflush(stdin);
scanf("%c", &resp); }//fim while
Área de segurança para intérprete de Libras. printf("Digite cidade A: "); scanf("%i", &cidade1); printf("Digite cidade B: "); scanf("%i", &cidade2);
printf("Digite tamanho do caminho: "); scanf("%i", &k); temCaminho = procuraCaminho(matriz, cidade1-1, cidade2-1, k);
Área de segurança para intérprete de Libras.
if (temCaminho ==1)
printf("Existe caminho de comprimento %i entre as cidades %i e% i", k, cidade1, cidade2); else
printf("Nao existe caminho de comprimento %i entre as cidades %i e% i", k, cidade1, cidade2); system("pause");
eturn 0; }