Anjolina Grisi de Oliveira
obs: muitos slides foram cedidos por
Adolfo Almeida Duran (UFBA)
2007
Conectividade
Caminho em um grafo não orientado
– Um caminho de tamanho n de u para v, onde n é um
inteiro positivo, em um grafo não orientado é uma
seqüência de arestas e1,...,en do grafo de forma que
f(e1) = {x0,x1}, f(e2) = {x1,x2}...f(en)={xn-1,xn}, onde x0=u
e xn=v.
G1
Se o grafo é simples,
denotamos o caminho
por sua seqüência de
vértices: x0, x1 ,...xn
Matemática Discreta/Grafos CIn-UFPE
2
Conectividade
• Caminho em um multigrafo direcionado
– Um caminho de tamanho n de u para v, onde n é um
inteiro positivo, em um multigrafo direcionado é uma
seqüência de arestas e1,...,en do grafo de forma que
f(e1) =(x0,x1), f(e2) = (x1,x2)...f(en)=(xn-1,xn), onde x0=u e
xn=v.
Quando não existem
arestas múltiplas, o
caminho pode se
denotado por um
seqüência de vértices:
(x2, x5, x4, x1)
Matemática Discreta/Grafos CIn-UFPE
3
Conectividade
Circuito ou ciclo
– Um caminho é um circuito se ele começa e
termina no mesmo vértice.
G1
Circuito: x1,x2,x5,x4,x1
Matemática Discreta/Grafos CIn-UFPE
4
Exemplos de ciclos
1
2
3
4
Ciclo de tamanho 3
1241
1
2
3
4
Ciclo de tamanho 3
1231
Matemática Discreta/Grafos CIn-UFPE
5
• Ciclo (ou circuito)
A seqüência de vértices
(x1, x2, x5, x4, x1)
é um exemplo de ciclo
Matemática Discreta/Grafos CIn-UFPE
6
Caminho (ou circuito) simples
Um caminho ou circuito é chamado de simples se
ele não contem a mesma aresta mais de uma
vez.
Matemática Discreta/Grafos CIn-UFPE
7
Conectividade
Definição para grafos não orientados
– Um grafo não orientado é chamado de conexo
(ou conectado) se existe um caminho entre
cada par de vértices distintos do grafo.
G1
Em uma rede de
computadores, quaisquer
dois computadores podem
se comunicar se e
somente se o grafo da
rede é conexo.
Matemática Discreta/Grafos CIn-UFPE
8
• Grafo desconexo
– O grafo mostrado a seguir não é conexo pois, por
exemplo, não existe um caminho entre x3 e x5.
Matemática Discreta/Grafos CIn-UFPE
9
• Componente conexa
– Um grafo G(V,A) desconexo é formado por pelo menos
dois subgrafos conexos, disjuntos em relação aos vértices
– Cada um destes subgrafos conexos é dito ser uma
componente conexa de G.
Matemática Discreta/Grafos CIn-UFPE
10
Vértice de corte (ou pontos de articulação)
Um vértice é dito ser um vértice de corte se
sua remoção (juntamente com as arestas a
ele conectadas) produz um grafo com mais
componentes conexos. (se o grafo original é
conexo, ele se torna desconexo).
X2 é um vértice de corte
Matemática Discreta/Grafos CIn-UFPE
11
Ponte
Uma aresta é dita ser uma ponte se sua
remoção produz um grafo com mais
componentes conexos.
(X1,X4) é uma ponte
Matemática Discreta/Grafos CIn-UFPE
12
• Grafo fortemente conexo
– No caso de grafos orientados (digrafos), um grafo é dito
ser fortemente conexo se existe um caminho de a para b
e de b para a, para cada par a,b de vértices do grafo.
– ou seja, se cada par de vértices participa de um circuito.
– Isto significa que cada vértice pode ser alcançável
partindo-se de qualquer outro vértice do grafo.
Matemática Discreta/Grafos CIn-UFPE
13
•Grafo fracamente conexo
Um grafo direcionado G(V,A) é chamado de
fracamente conexo se existe um caminho entre
cada par de vértices no grafo não orientado
subjacente.
Cada um destes
subgrafos é
fortemente conexo.
No entanto, o grafo
todo é apenas
fracamente conexo.
Matemática Discreta/Grafos CIn-UFPE
14
Circuito Euleriano
Um circuito euleriano em um grafo G é um
circuito simples que contem cada aresta de G.
Matemática Discreta/Grafos CIn-UFPE
15
Teorema (Euler 1736)
Um multigrafo conectado G possui um circuito
euleriano se e somente se o grau de cada vértice
de G é par.
Prova:
Ida: Seja G um grafo euleriano. Por cada ocorrência de
vértice do circuito euleriano, existe uma aresta que chega
nesse vértice e outra que sai desse vértice. Como toda
aresta faz parte do circuito, isto é, nenhuma aresta fica
fora do ciclo, necessariamente o número de arestas por
cada vértice é par.
Matemática Discreta/Grafos CIn-UFPE
16
Volta: Suponhamos que todos os vértices possuem
grau par. Seja vi um vértice do grafo. Tentemos, a partir
de vi, construir um caminho que não passa duas vezes
pela mesma aresta, e até que não seja possível
continuar. Como todos os vértices possuem um grau
par, sempre será possível entrar e sair de um vértice. A
única exceção é o vértice vi onde o caminho vai
terminar. Se esse caminho, que chamaremos C1,
contém todas as arestas de G, temos um ciclo
euleriano. Senão, retiramos de G todas as arestas que
fazem parte de C1. No grafo resultante G', todos os
vértices também possuem grau par e necessariamente
um deles faz parte de C1, senão o grafo não seria
conexo.
Matemática Discreta/Grafos CIn-UFPE
17
Volta (cont.): Recomeçamos o mesmo processo com o
grafo G', partindo de um vértice comum com C1,
obtendo assim um novo circuito C2. A figura abaixo
mostra que dois circuitos que têm um vértice em
comum podem formar um circuito único: chegando no
vértice comum em um dos dois circuitos, continuamos
o percurso no outro circuito. Continuando esse
processo, necessariamente obteremos um circuito
único que contém todas as arestas de G.
Matemática Discreta/Grafos CIn-UFPE
18
Algoritmo de Hierholzer
Algoritmo para a construção de um ciclo euleriano
sugerido a partir da prova do teorema de Euler
Comece em qualquer vértice u e percorra aleatoriamente
as arestas ainda não visitadas a cada vértice visitado até
fechar um ciclo
Se sobrarem arestas não visitadas, recomece a partir de
um vértice do ciclo já formado
Se não existem mais arestas não visitadas, construa o
ciclo euleriano a partir dos ciclos formados, unindo-os a
partir de um vértice comum
Matemática Discreta/Grafos CIn-UFPE
19
Algoritmo de Hierholzer
Algoritmo para a construção de um ciclo euleriano
sugerido a partir da prova do teorema de Euler
Matemática Discreta/Grafos CIn-UFPE
20
• As pontes de Königsberg
É possível sair de uma das ilhas, passar uma
única vez por cada uma das pontes e retornar ao
ponto de origem ?
Matemática Discreta/Grafos CIn-UFPE
21
• As pontes de Königsberg
Como nem todos os vértices têm grau par, o grafo
não é euleriano. Logo, é impossível atravessar
todas as pontes uma só vez e voltar ao lugar de
partida
Matemática Discreta/Grafos CIn-UFPE
22
Algoritmo de Fleury
Algoritmo para a construção de um ciclo euleriano
em um grafo euleriano
Comece em qualquer vértice u e percorra as
arestas de forma aleatória, seguindo sempre as
seguintes regras:
I – apague as arestas depois de passar por elas
II – se aparecer algum vértice isolado, apague-o
também
III – passe por uma ponte somente se não houver
outra alternativa
Matemática Discreta/Grafos CIn-UFPE
23
Algoritmo de Fleury
Algoritmo para a construção de um ciclo euleriano
em um grafo euleriano
Matemática Discreta/Grafos CIn-UFPE
24
Caminhos, circuitos Hamiltonianos
Um caminho (ou circuito) em um grafo G(V,E)
é dito ser hamiltoniano se ele passa
exatamente uma vez em cada um dos vértices
de G
Caminho e circuito
hamiltoniano
Apenas caminho
hamiltoniano
Matemática Discreta/Grafos CIn-UFPE
25
Mais exemplos
Circuito e caminho
caminho
Matemática Discreta/Grafos CIn-UFPE
não
hamiltoniano
26
Grafo hamiltoniano
Não existe uma caracterização para identificar grafos
hamiltonianos como existe para os eulerianos
A busca de tal caracterização é um dos maiores
problemas ainda não solucionados da teoria dos
grafos
Matemática Discreta/Grafos CIn-UFPE
27
Grafo hamiltoniano
Muito pouco é conhecido dos grafos hamiltonianos
A maioria dos teoremas existentes são da forma: “Se
G possui arestas suficientes, então G é hamiltoniano”
Matemática Discreta/Grafos CIn-UFPE
28
Circuito hamiltoniano em grafos completos
Todo grafo completo, que contém mais
de 2 vértices contem um circuito
hamiltoniano
Seja v1,v2,...,vn os vértices de G. Como
existe uma aresta entre qualquer par de
vértices, é possivel, a partir de v1 percorrer
essa sequência até vn e voltar para v1
Matemática Discreta/Grafos CIn-UFPE
29
Teorema (Dirac 1952)
Uma condição suficiente, mas não necessária,
para que um grafo conexo simples G com n (>2)
vértices tenha um circuito hamiltoniano é que o
grau de todo vértice de g seja  n/2
O grafo abaixo, possui um circuito hamiltoniano mas não
respeita a condição do teorema de Dirac
Matemática Discreta/Grafos CIn-UFPE
30
Teorema (Ore 1960)
Uma condição suficiente, mas não necessária, para
que um grafo simples G com n (>2) vértices tenha
um circuito hamiltoniano é que a soma dos graus de
cada par de vértices não adjacentes seja no mínimo
n.
Permite identificar mais grafos com circuitos hamiltonianos
que o anterior, mas demora muito para efetuar os
cálculos. Uma busca por tentativa e erro pode ser mais
eficiente em alguns casos
Matemática Discreta/Grafos CIn-UFPE
31
O adjetivo "hamiltoniano" deve-se ao matemático
irlandês Sir William Rowan Hamilton (1805-1865).
Diz-se que ele inventou um jogo que envolve um
dodecaedro (sólido regular com 20 vértices, 30
arestas e 12 faces).
Hamilton rotulou cada vértice do dodecaedro com o
nome de uma cidade conhecida.
O objetivo do jogo era que o jogador viajasse "ao
redor do mundo" ao determinar uma viagem circular
que incluísse todas as cidades exatamente uma vez,
com a restrição de que só fosse possível viajar de
uma cidade a outra se existisse uma aresta entre os
vértices correspondentes.
Matemática Discreta/Grafos CIn-UFPE
32
A figura abaixo mostra um grafo que
representa este problema, ou seja os vértices
e arestas de um dodecaedro.
Matemática Discreta/Grafos CIn-UFPE
33
Alguns Problemas
Como explorar um grafo
Como obter um processo sistemático para caminhar
pelos vértices e arestas de um grafo?
Como caminhar no grafo de modo a visitar todos os
vértices e arestas evitando repetições
desnecessárias de visitas a um mesmo vértice ou
aresta?
Que recursos adicionais são necessários?
Matemática Discreta/Grafos CIn-UFPE
34
Como explorar um grafo
Necessidade de ‘’marcar’’ quando um vértice e uma
aresta já foram visitados ou não
Algoritmo Geral
Busca Geral G(V,E)
1. Escolher e marcar um vértice inicial;
2. Enquanto existir algum vértice v marcado e incidente a
uma aresta (v,w), não explorada, efetuar:
a) escolher o vértice v;
b) explorar a aresta (v,w). Se w não é marcado então
marcar w.
Matemática Discreta/Grafos CIn-UFPE
35
O problema do Caminho mais curto
Um motorista deseja encontrar o caminho, mais curto
possível, entre duas cidades do Brasil
Caso ele receba um mapa das estradas de rodagem do
Brasil, no qual a distância entre cada par adjacente de
cidades está exposta, como poderíamos determinar uma
rota mais curta entre as cidades desejadas?
Uma maneira possível é enumerar todas as rotas
possíveis que levam de uma cidade à outra, e então
selecionar a menor.
Matemática Discreta/Grafos CIn-UFPE
36
O problema do menor caminho consiste em
determinar um menor caminho entre um
¨
vértice
de origem s  V e todos os vértices v
de V.
Matemática Discreta/Grafos CIn-UFPE
37
O problema do Caminho mais curto
Uma maneira mais eficiente:
Percorra o grafo, partindo do vértice de origem s,
associando a cada vértice um número l(v) indicando a
menor distância entre s e v.
Isso significa que quando chegamos ao vértice v, na
figura abaixo, l(v) será min ( l(u)+6 , l(x)+4 )
u
v
6
3
s
2
1 4 2 7
3
5
x
6
y
Matemática Discreta/Grafos CIn-UFPE
38
Grafos com pesos:
- Cada aresta possui um número associado (peso)
- O tamanho do caminho é a soma dos pesos das
arestas do caminho
u
v
6
3
9
3
s
2
0
4
1
2
7
3
5
5
x
6
11
y
Matemática Discreta/Grafos CIn-UFPE
39
Como obter um caminho mínimo partindo de s para y?
u
v
6
3
9
3
s
2
0
4
1
2
7
3
5
5
x
6
11
y
Matemática Discreta/Grafos CIn-UFPE
40
Outra possibilidade:
u
v
6
3
9
3
s
2
0
4
1
2
7
3
5
5
x
6
11
y
Matemática Discreta/Grafos CIn-UFPE
41
O algoritmo de Dijkstra
O algoritmo de Dijkstra aqui descrito identifica o menor
caminho entre dois vértices de um grafo não orientado.
Se desejamos calcular o menor caminho de a para z em
um grafo conexo simples com pesos, primeiro
encontramos um menor caminho entre a e um primeiro
vértice, depois entre a e um segundo vértice, esse
procedimento é repetido até que seja encontrado um
menor caminho entre a e z.
Matemática Discreta/Grafos CIn-UFPE
42
O algoritmo de Dijkstra
Um conjunto S de vértices é construído inserindo-se um
vértice a cada iteração.
A cada iteração também é adotado um procedimento
para rotular vértices: um vértice w é rotulado com o
tamanho do menor caminho de a até ele, e que contem
somente vértices do conjunto S.
O vértice a ser inserido em S é aquele com o menor
rótulo.
Matemática Discreta/Grafos CIn-UFPE
43
O algoritmo de Dijkstra
O algoritmo começa rotulando a com 0 e os demais
vértices com . Usamos a notação L0(a)=0 e L0(v)= .
(na iteração 0).
A notação Sk é usada para denotar o conjunto S após a
iteração k. Começamos com S0=. O conjunto Sk é
formado a partir de Sk-1 adicionado-se um vértice u que
não está em Sk-1 e possui o menor rótulo.
Após a inclusão de u em Sk, atualizamos os rótulos de
todos os vértices que não estão nesse conjunto da
seguinte maneira: Lk(v) é o tamanho do menor caminho
de a até v que contem apenas os vértices de Sk.
.
Matemática Discreta/Grafos CIn-UFPE
44
O algoritmo de Dijkstra
Seja v um vértice que não está em Sk. Para atualizar o
rótulo de v, observe que Lk(v) é o tamanho do menor
caminho de a para v e que contém apenas os vértices
que estão em Sk..
Esse caminho ou é o menor caminho que contem
apenas os elementos de Sk-1 (sem a inclusão de u) ou é
o menor caminho de a até u no passo k-1 com adição da
aresta (u,v).
Lk(v) = min(Lk-1(v),Lk-1(u)+ peso(u,v))
Matemática Discreta/Grafos CIn-UFPE
45
O algoritmo de Dijkstra
procedimento Dijkstra
Para i := 1 até n:
L(v)= .
L(a) = 0
S=
Enquanto z S
u := Elemento que S e L(u) é mínimo
S := S  {u}
Para cada vértice v  S :
Se L(u) + peso(u,v) < L(v) então
L(v) = L(u) + peso(u,v)
(observe que L(v) = min(L(v),L(u)+ peso[u,v])
Retornar L(z)
Matemática Discreta/Grafos CIn-UFPE
46
Exemplo: Menor caminho de A até D
0: L(A)=0 e todos os outro é ; S=;
1: S={A}; L(B)=4; L(F)=2;
2: S={A,F}; L(B)=3; L(C)=10; L(E)=12;
3: S={A,F,B}; L(C)=8;
4: S={A,F,B,C}; L(D)=14; L(E)=10;
5: S={A,F,B,C,E}; L(D)=13;
6: S={A,F,B,C,E,D}
B
5
C
4
6
8
1
A
2
2
D
3
F
10
E
Matemática Discreta/Grafos CIn-UFPE
47
Download

Grafos