Grafos
Definição
●Estrutura matemática para modelar relações
●Um grafo G(V,E) é composto por um conjunto de
vértices V e um conjunto de Arcos/Arestas E.
●Vértices são também chamados de Nós ou
Arcos e Arestas
● Um Arco a=(u,v) é uma ligação entre dois
vértices u e v. Neste caso dizemos que o arco tem origem em u e destino em v
● Uma Aresta e=(u,v) é uma ligação entre dois
vértices u e v. A aresta incide nos dois vértices
Adjacência
● Arcos/Arestas expressam relações de
adjacência
● No caso das arestas dizemos que os dois nós
Exemplo
1 2
Definições
● Caminho de i para j: é um conjunto de nós
pelos quais é possível passar para chegar a um nó j partindo de um nó i, observando a relação de adjacência
Exemplo
1 2
3 4
Definições
● Laço: (loop) arcos/aresta com início e fim no
mesmo vértice (u,u)
● Grafo Trivial: Grafo com um único Vértice
Definições
● Grafo Completo: um grafo com uma aresta
para cada par de nós
● Subgrafo: um grafo G'(V',E') é dito subgrafo de
G(V,E) se e
● Grafo Conexos: Existe um caminho para cada
par de vértices. Grafos desconexos são
Variações
● Em alguns casos, os nós além de uma
identificação possuem informações relevantes ao problema
● Aos arcos são comumente atribuídos valores
Exemplo
1,N 2,A
3,B 4,C
12
8 2
5
Caminho
● Comprimento de um caminho é o número de
nós que este caminho possuí
● Custo de um caminho é a soma dos custos
envolvidos para atravessar o caminho (os
Representações
● Existem duas representações clássicas para
grafos
● Matriz de Adjacência
Matriz de Adjacência
1 2 3 4 5
1 0 1 2 2 3
2 1 0 2 1 3
3 2 2 0 2 3
4 2 1 2 0 3
Matriz de Adjacência
1 2 3 4 5
1 0 1 2 2 3
2 1 0 2 1 3
3 2 2 0 2 3
4 2 1 2 0 3
5 3 3 3 3 0
O
ri
g
e
n
s
Destinos
Lista de Adjacência
1
2
3
...
2,3 3,1 5,9
1,3 3,4
Prós e Contras
● Lista de Adjacência é mais adequada quando o
grafo é esparso
● Para grafos densos a representação por matriz
Caminho mínimo
● Em muitos casos é necessário determinar o
caminho mínimo (ou de custo mínimo) entre dois nós. O mais comum é encontrar o
caminho mínimo de uma origem para todos os outros nós
Modelagem matemática do
problema de Caminho Mínimo
● Seja o grafo G(V,E) onde V é o conjunto de
vértices e E o conjunto de arestas.
● Seja (i,j) uma aresta entre os vértices
● Seja o custo de atravessar a aresta (i,j)
● Seja s um vértice especial origem dos caminhos
● Seja
● Seja a variável que representa o fluxo que
i , j∈V
cij
n=∣V∣
Modelagem matemática do
problema de Caminho Mínimo
minimizar
∑
(i , j)∈E
cij xij
sujeito a
∑
j:(i , j)∈E
xij−
∑
j:( j , i)∈E
x ji=n−1, se i=s
∑
j:(i , j)∈E
xij−
∑
j:( j , i)∈E
x ji=−1, ∀ i∈V −{s }
Modelagem matemática do
problema de Caminho Mínimo
● Seja o grafo G(V,E) onde V é o conjunto de vértices e
E o conjunto de arestas.
● Seja (i,j) uma aresta entre os vértices
● Seja o custo de atravessar a aresta (i,j)
● Seja s um vértice especial origem dos caminhos
● Seja
● Seja a variável que representa o fluxo que passa
pela aresta (i,j)
i , j∈V
cij
n=∣V∣
Modelagem matemática do
problema de Caminho Mínimo
minimizar
∑
(i , j)∈E
cij yij
sujeito a
∑
j:(i , j)∈E
xij−
∑
j:( j , i)∈E
x ji=n−1, se i=s
∑
j:(i , j)∈E
xij−
∑
j:( j , i)∈E
Algoritmo de Dijkstra
● Seja c[i][j] o custo do arco que vai de i para j.
Caso este arco não exista c[i][j] = Infinito
● Seja D[i] o custo do menor caminho entre o nó
Algoritmo de Dijkstra
X = {origem}
Para cada i pertencente a V-X
D[i] <- C[origem][i] //inicialização D Enquanto (V-X != Vazio)
escolha w em V-X tal que D[w] é mínimo X = X+{w}
Casos Gerais
● O Algoritmo de Dijkstra é eficiente quando os
arcos não possuem custos negativos
● Em casos onde há custos negativos o
Casos Gerais
● Adicionar uma constante a todos os arcos não
resolve o problema
s t
2
2
1 -10
Casos Gerais
● Adicionar uma constante a todos os arcos não
resolve o problema
s t
2
2
1 -10
5
s t
12 12
Algoritmo de Correção de Rótulos
● Seja “s” a origem do caminho
● Seja p um vetor que diz quem é o predecessor
Algoritmo de Correção de Rótulos
Início D[s]=0
D[j]= M para cada j em V-{s}//M→constante muito grande
P[s]=0
P[j]=N para cada j em V-{s}// N → indica não avaliado
enquanto( )faça D[j]= D[i]+c[i][j]
p[j] = i