Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Grafos
1. Definição
2. Exemplo
3. Grafos orientados
4. Grafos não orientados
5. Grafos ponderados
6. Outras definições
7. Representação de grafos: matrizes e
listas
8. Operações elementares: busca em
profundidade e largura
9. Algoritmo do menor caminho - Dijkstra
Definição de grafo
Um grafo consiste de 2 conjuntos:
V (finito e não vazio):
conjunto de vértices (nós)
E:
conjunto de pares de vértices (arestas)
Exemplo de grafo
G = (V,E)
V = {1,2,3}
E = {(1,2),(2,3)}
3
1
Grafos orientados (Dígrafos)
Cada aresta é representada por um par
direcionado.
<u,v> e <v,u> são arestas diferentes.
Exemplo:
V = {1,2,3}
E = {<1,2>,<2,1>,<2,3>}
1 2 3
Grafos não orientados
Uma aresta é representada por pares de
vértices não ordenados.
(u,v) e (v,u) representam a mesma aresta
Exemplo:
V = {1,2,3}
E = {(1,2),(2,3)}
1 2 3
Grafos Ponderados (redes)
Grafo em que cada aresta tem um peso
que pode representar:
Distância entre vértices
Custo de ir de um vértice a outro
Definição – Grau de um vértice
Grau de um vértice é o número de arestas
incidentes no vértice.
Para grafos orientados:
Grau de entrada
Grau de saída
1 2 3
1 0 1 1 0
2 3 A= 1 0 0 1
1 0 0 1
4 0 1 1 0
Grau de um vértice = somatória de sua linha
0 1 0
3 A= 1 0 1
1 2 0 0 0
Grau de saída = soma da linha
Grau de entrada = soma da coluna
Representação de Grafos - Listas
Listas de adjacências: vetor de listas de
adjacentes.
Exemplo:
1 1 2 3
2 3 2 1 4
3 1 4
4
4 2 3
Exercícios
Calcular grau de um vértice
Verificar se 2 vértices são adjacentes
Definição – Grafo completo
Grafo completo: existe uma aresta entre
quaisquer pares de vértices.
1 1 2 1
2 3 2 3 4 3
2
4 G’ G’’ G’’’
G
Outras definições
Caminhos: um caminho entre os vértices
u e v no grafo G é uma seqüência
u, i1, i2, ...,ik, v tal que
(u,i1), (i1,i2),..., (ik,v) são arestas em E(G),
se G for não orientado
<u,i1>,<i1,i2>,..., <ik,v> são arestas em
E(G), se G for orientado
Outras definições
Comprimento de um caminho é igual ao número
de arestas nesse caminho.
Caminho simples é um caminho em que todos os
vértices exceto primeiro e último aparecem uma
única vez.
Ciclo é um caminho simples em que o primeiro e
o último vértices são os mesmos.
Vértices conectados: os vértices u e v de um
grafo são conectados se existe um caminho entre
eles.
Operações Elementares
Visitar todos os vértices de um grafo G
que são alcançados a partir de um vértice
v:
Busca em profundidade
Busca em largura
Busca em profundidade
Busca iniciando de um vértice v:
Seleciona w adjacente de v ainda não visitado e
faz busca a partir de w
Se todos os vértices adjacentes de v foram
visitados, volta para vértice anterior visitado que
tem vértice w não visitado e inicia busca a partir
de w
Se todos os vértices já tiverem sido visitados, a
busca termina.
Busca em profundidade - Exemplo
B C
D E F G
D E F G
H
Busca em largura
void buscalargura(int v,matriz M, int n)
{ tfila f; int i;
visita[v]=TRUE;
inicia(&f); insere(&f,v);
while (!vazia(&f)) {
remove(&f,&v);printf(“%c”,R[v]);
for (i=0;i<n;i++)
if (!visita[i]&& M[v][i]) {
insere(&f,i);visita[i]=TRUE;
}
}
}
Algoritmo do menor caminho
De Dijkstra
Retorna o custo do menor caminho do vértice ini até o
vértice fim.
Estruturas de dados:
Matriz peso: peso[i][j] contém o peso da aresta (i,j)
Vetor distancia:
Distancia[i]: custo do menor caminho de vértice ini até i
Vetor fazparte: se fazparte[i] for true, nó i já tem distância
mínima conhecida (a partir do nó atual)
Vetor precede:
Precede[i] contém o nó que precede o nó i no menor caminho
encontrado.
No final do algoritmo:
Distancia[fim] contém a menor distância de ini a fim
A partir de precede[fim], pode-se obter o caminho de menor
custo.
Exemplo de grafo
0 100
10
30
1 4
10
50 60
0 1 2 3 4
2 3 0 ~ 10 ~ 30 100
20
1 ~ ~ 50 ~ ~
Peso = 2 10
3 20 60
4
Algoritmo
int caminhomenorcusto(
int ini, int fim, int precede[MAX], int peso[MAX][MAX])
{
int i,novadist,menor,datual,k,atual;
boolean fazparte[MAX];
int distancia[MAX];
for (i=0;i<MAX;i++){
fazparte[i]=FALSE;
distancia[i]=MAXINT;
}
fazparte[ini]=TRUE;
distancia[ini]=0;
atual=ini;
Algoritmo (cont.)
while (atual!=fim) {
menor=MAXINT; datual=distancia[atual];
for (i=0;i<MAX;i++)
if(!fazparte[i]){
novadist=datual+peso[atual][i];
if (novadist<distancia[i]){
precede[i]=atual;
distancia[i]=novadist;
if (distancia[i]<menor){
menor=distancia[i];k=i;
}
}
}
atual=k;fazparte[atual]=TRUE;
}
return distancia[atual];
}
Exemplo de execução
atual = 0 0 1 2 3 4
fazparte 0 1 2 3 4 0 ~ 10 ~ 30 100
T F F F F 1 ~ ~ 50 ~ ~
distancia 0 1 2 3 4
2 10
0 ~ ~ ~ ~
menor = ~ 3 20 60
datual= 0 (distancia[atual]) 4
i=1
novadist = 0 + peso[0][1] = 0 + 10 = 10
distancia 0 1 2 3 4
0 10 ~ ~ ~ (novadist)
precede 0 1 2 3 4 (atual)
0
menor = 10
k= 1
Exemplo de execução
0 1 2 3 4
atual = 0
fazparte 0 1 2 3 4 0 ~ 10 ~ 30 100
T F F F F 1 ~ ~ 50 ~ ~
distancia 0 1 2 3 4 2 10
0 ~ ~ ~ ~
3 20 60
menor = 10
datual= 0 (distancia[atual]) 4
i=2
novadist = 0 + peso[0][2] = 0 + ~ = ~
distancia 0 1 2 3 4
0 10 ~ ~ ~
precede 0 1 2 3 4
0
menor = 10
k= 1
Exemplo de execução
atual = 0 0 1 2 3 4
fazparte 0 1 2 3 4 0 ~ 10 ~ 30 100
T F F F F 1 ~ ~ 50 ~ ~
distancia 0 1 2 3 4
0 10 ~ ~ ~ 2 10
menor = 10 3 20 60
datual= 0 (distancia[atual])
4
i=3
novadist = 0 + peso[0][3] = 0 + 30 = 30
distancia 0 1 2 3 4
0 10 ~ 30 ~ (novadist)
precede 0 1 2 3 4
0 0 (atual)
menor = 10
k= 1
Exemplo de execução
atual = 0 0 1 2 3 4
fazparte 0 1 2 3 4 0 ~ 10 ~ 30 100
T F F F F 1 ~ ~ 50 ~ ~
distancia 0 1 2 3 4
0 10 ~ 30 ~ 2 10
menor = 10 3 20 60
datual= 0 (distancia[atual])
4
i=4
novadist = 0 + peso[0][4] = 0 + 100 = 100
distancia 0 1 2 3 4
0 10 ~ 30 100 (novadist)
precede 0 1 2 3 4
0 0 0 (atual)
menor = 10
k= 1
Exemplo de execução
atual = 1 0 1 2 3 4
fazparte 0 1 2 3 4 0 ~ 10 ~ 30 100
T T F F F 1 ~ ~ 50 ~ ~
distancia 0 1 2 3 4
2 10
0 10 ~ 30 100
menor = ~ 3 20 60
datual = 10 (distancia[atual]) 4
i=2
novadist = 10 + peso[1][2] = 10 + 50 = 60
distancia 0 1 2 3 4
0 10 60 30 100
precede 0 1 2 3 4
0 1 0 0
menor = 60
k= 2
Exemplo de execução
atual = 1 0 1 2 3 4
fazparte 0 1 2 3 4 0 ~ 10 ~ 30 100
T T F F F 1 ~ ~ 50 ~ ~
distancia 0 1 2 3 4
2 10
0 10 60 30 100
menor = 60 3 20 60
datual = 10 (distancia[atual]) 4
i=3
novadist = 10 + peso[1][3] = 10 + ~ = ~
distancia 0 1 2 3 4
0 10 60 30 100
precede 0 1 2 3 4
0 1 0 0
menor = 60
k= 2
Exemplo de execução
atual = 1 0 1 2 3 4
fazparte 0 1 2 3 4 0 ~ 10 ~ 30 100
T T F F F 1 ~ ~ 50 ~ ~
distancia 0 1 2 3 4
2 10
0 10 60 30 100
menor = 30 3 20 60
datual = 10 (distancia[atual]) 4
i=4
novadist = 10 + peso[1][4] = 10 + ~ = ~
distancia 0 1 2 3 4
0 10 60 30 100
precede 0 1 2 3 4
0 1 0 0
menor = 60
k= 2
Exemplo de execução
atual = 2 0 1 2 3 4
fazparte 0 1 2 3 4 0 ~ 10 ~ 30 100
T T T F F 1 ~ ~ 50 ~ ~
distancia 0 1 2 3 4
2 10
0 10 60 30 100
menor = ~ 3 20 60
datual = 60 (distancia[atual]) 4
i=4
novadist = 60 + peso[2][4] = 60 + 10 = 70
distancia 0 1 2 3 4
0 10 60 30 70
precede 0 1 2 3 4
0 1 0 2
menor = 70
k= 4
Exemplo de execução
atual = 4 (=fim)
fazparte 0 1 2 3 4
T T T F T
distancia 0 1 2 3 4
0 10 60 30 70
70 é a menor distância
Precede 0 1 2 3 4
0 1 0 2
caminho = 0 1 2 4