Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Transparncias
Motivao
Muitas aplicaes em computao
necessitam considerar conjunto de conexes
entre pares de objetos:
Existe um caminho para ir de um objeto a
outro seguindo as conexes?
Qual a menor distncia entre um objeto
e outro objeto?
Quantos outros objetos podem ser
alcanados a partir de um determinado
objeto?
Existe um tipo abstrato chamado grafo que
usado para modelar tais situaes.
Aplicaes
Alguns exemplos de problemas prticos que
podem ser resolvidos atravs de uma
modelagem em grafos:
Ajudar mquinas de busca a localizar
informao relevante na Web.
Descobrir os melhores casamentos entre
posies disponveis em empresas e
pessoas que aplicaram para as posies
de interesse.
Descobrir qual o roteiro mais curto para
visitar as principais cidades de uma regio
turstica.
Conceitos Bsicos
Grafo: conjunto de vrtices e arestas.
Vrtice: objeto simples que pode ter nome e
outros atributos.
Aresta: conexo entre dois vrtices.
3
aresta
1
vrtice
Notao: G = (V, A)
G: grafo
V: conjunto de vrtices
A: conjunto de arestas
Grafos Direcionados
Um grafo direcionado G um par (V, A), onde
V um conjunto finito de vrtices e A uma
relao binria em V .
Uma aresta (u, v) sai do vrtice u e entra
no vrtice v. O vrtice v adjacente ao
vrtice u.
Podem existir arestas de um vrtice para
ele mesmo, chamadas de self-loops.
0
Grafos No Direcionados
Um grafo no direcionado G um par (V, A),
onde o conjunto de arestas A constitudo de
pares de vrtices no ordenados.
As arestas (u, v) e (v, u) so consideradas
como uma nica aresta. A relao de
adjacncia simtrica.
Self-loops no so permitidos.
0
Grau de um Vrtice
Em grafos no direcionados:
O grau de um vrtice o nmero de
arestas que incidem nele.
Um vrice de grau zero dito isolado ou
no conectado.
Ex.: O vrtice 1 tem
grau 2 e o vrtice 3
isolado.
Em grafos direcionados
O grau de um vrtice o nmero de
arestas que saem dele (out-degree) mais
o nmero de arestas que chegam nele
(in-degree).
Ex.: O vrtice 2 tem
in-degree 2, out-degree
2 e grau 4.
Ciclos
Em um grafo direcionado:
Um caminho (v0 , v1 , . . . , vk ) forma um ciclo
se v0 = vk e o caminho contm pelo
menos uma aresta.
O ciclo simples se os vrtices
v1 , v2 , . . . , vk so distintos.
O self-loop um ciclo de tamanho 1.
Dois caminhos (v0 , v1 , . . . , vk ) e
(v00 , v10 , . . . , vk0 ) formam o mesmo ciclo se
existir um inteiro j tal que vi0 = v(i+j) mod k
para i = 0, 1, . . . , k 1.
Ex.: O caminho (0, 1, 2, 3, 0) forma um ciclo. O
caminho(0, 1, 3, 0) forma o mesmo ciclo que os
caminhos (1, 3, 0, 1) e (3, 0, 1, 3).
0
Ciclos
Em um grafo no direcionado:
Um caminho (v0 , v1 , . . . , vk ) forma um ciclo
se v0 = vk e o caminho contm pelo
menos trs arestas.
O ciclo simples se os vrtices
v1 , v2 , . . . , vk so distintos.
Ex.: O caminho (0, 1, 2, 0) um ciclo.
0
10
Componentes Conectados
Um grafo no direcionado conectado se
cada par de vrtices est conectado por um
caminho.
Os componentes conectados so as pores
conectadas de um grafo.
Um grafo no direcionado conectado se ele
tem exatamente um componente conectado.
Ex.: Os componentes so: {0, 1, 2}, {4, 5} e {3}.
0
11
12
Grafos Isomorfos
G = (V, A) e G0 = (V 0 , A0 ) so isomorfos se
existir uma bijeo f : V V 0 tal que
(u, v) A se e somente se (f (u), f (v)) A0 .
0
1
4
13
Subgrafos
Um grafo G0 = (V 0 , A0 ) um subgrafo de
G = (V, A) se V 0 V e A0 A.
Dado um conjunto V 0 V , o subgrafo
induzido por V 0 o grafo G0 = (V 0 , A0 ), onde
A0 = {(u, v) A|u, v V 0 }.
Ex.: Subgrafo induzido pelo conjunto de vrtices
{1, 2, 4, 5}.
0
14
15
16
Grafos Completos
Um grafo completo um grafo no
direcionado no qual todos os pares de
vrtices so adjacentes.
Possui (|V |2 |V |)/2 = |V |(|V | 1)/2 arestas,
pois do total de |V |2 pares possveis de
vrtices devemos subtrair |V | self-loops e
dividir por 2 (cada aresta ligando dois vrtices
contada duas vezes).
O nmero total de grafos diferentes com |V |
vrtices 2|V |(|V |1)/2 (nmero de maneiras
diferentes de escolher um subconjunto a
partir de |V |(|V | 1)/2 possveis arestas).
17
18
rvores
rvore livre: grafo no direcionado acclico e
conectado. comum dizer apenas que o
grafo uma rvore omitindo o livre.
Floresta: grafo no direcionado acclico,
podendo ou no ser conectado.
rvore geradora de um grafo conectado
G = (V, A): subgrafo que contm todos os
vrtices de G e forma uma rvore.
Floresta geradora de um grafo G = (V, A):
subgrafo que contm todos os vrtices de G e
forma uma floresta.
(a)
(b)
19
20
21
22
Matriz de Adjacncia
A matriz de adjacncia de um grafo
G = (V, A) contendo n vrtices uma matriz
n n de bits, onde A[i, j] 1 (ou verdadeiro)
se e somente se existe um arco do vrtice i
para o vrtice j.
Para grafos ponderados A[i, j] contm o
rtulo ou peso associado com a aresta e,
neste caso, a matriz no de bits.
Se no existir uma aresta de i para j ento
necessrio utilizar um valor que no possa
ser usado como rtulo ou peso.
23
24
0 1 2 3 4 5
0
1
1
1
1 1
2
1 1
3 1
4
5
0 1 2 3 4 5
0
1 1
1 1
1
2 1 1
3
4
5
(a)
(b)
25
26
27
28
" );
" );
" );
" );
29
5
0
1
7
2 7
0
1
7
1 3
5
0
1 5
1 5
0 5
2 7
1 7
30
31
32
33
34
35
3
0
(a)
V
7
0
1
2
3
4
5
6
4
6
2
3
1
1
2
cab
5
0
(b)
7
3
0
1
2
3
4
5
6
7
4
6
7
3
1
0
2
1
prox peso
4
5
0
0
0
6
0
5
3
7
prox peso
4
5
7
0
0
6
0
0
5
5
7
7
36
37
38
}
}
public int numVertices ( ) { return this .numVertices ; }
}
Busca em Profundidade
A busca em profundidade, do ingls
depth-first search), um algoritmo para
caminhar no grafo.
A estratgia buscar o mais profundo no
grafo sempre que possvel.
As arestas so exploradas a partir do vrtice
v mais recentemente descoberto que ainda
possui arestas no exploradas saindo dele.
Quando todas as arestas adjacentes a v
tiverem sido exploradas a busca anda para
trs para explorar vrtices que saem do
vrtice do qual v foi descoberto.
O algoritmo a base para muitos outros
algoritmos importantes, tais como verificao
de grafos acclicos, ordenao topolgica e
componentes fortemente conectados.
39
Busca em Profundidade
Para acompanhar o progresso do algoritmo
cada vrtice colorido de branco, cinza ou
preto.
Todos os vrtices so inicializados branco.
Quando um vrtice descoberto pela
primeira vez ele torna-se cinza, e tornado
preto quando sua lista de adjacentes tenha
sido completamente examinada.
d[v]: tempo de descoberta
t[v]: tempo de trmino do exame da lista de
adjacentes de v.
Estes registros so inteiros entre 1 e 2|V | pois
existe um evento de descoberta e um evento
de trmino para cada um dos |V | vrtices.
40
= 1;
= 2;
41
42
43
b( / )
c(1/ )
b( / )
b( / )
b( / ) 2
b( / )
b( / ) 2
(a)
(b)
c(1/ )
c(2/ )
c(1/ )
c(2/ )
b( / )
b( / ) 2
b( / )
c(3/ ) 2
(c)
(d)
c(1/ )
c(2/ )
1
b( / )
p(3/4) 2
(e)
44
p(2/5)
p(1/6)
p(2/5)
1
b( / )
b( / )
p(3/4) 2
p(3/4) 2
(g)
(f)
p(1/6)
p(2/5)
p(1/6)
p(2/5)
c(7/ )
p(3/4) 2
(h)
p(7/8)
p(3/4) 2
(i)
|adj[u]| = O(|A|),
uV
45
Classificao de Arestas
Existem:
1. Arestas de rvore: so arestas de uma
rvore de busca em profundidade. A aresta
(u, v) uma aresta de rvore se v foi
descoberto pela primeira vez ao percorrer a
aresta (u, v).
2. Arestas de retorno: conectam um vrtice u
com um antecessor v em uma rvore de
busca em profundidade (inclui self-loops).
3. Arestas de avano: no pertencem rvore
de busca em profundidade mas conectam um
vrtice a um descendente que pertence
rvore de busca em profundidade.
4. Arestas de cruzamento: podem conectar
vrtices na mesma rvore de busca em
profundidade, ou em duas rvores diferentes.
46
47
Classificao de Arestas
Classificao de arestas pode ser til para
derivar outros algoritmos.
Na busca em profundidade cada aresta pode
ser classificada pela cor do vrtice que
alcanado pela primeira vez:
Branco indica uma aresta de rvore.
Cinza indica uma aresta de retorno.
Preto indica uma aresta de avano quando
u descoberto antes de v ou uma aresta
de cruzamento caso contrrio.
2/9
3/6
2
arv
arv
arv
ret
arv
1/10
cruz
avan
3
4/5
cruz
4
7/8
cruz
5
11/12
48
Busca em Largura
Expande a fronteira entre vrtices
descobertos e no descobertos
uniformemente atravs da largura da
fronteira.
O algoritmo descobre todos os vrtices a uma
distncia k do vrtice origem antes de
descobrir qualquer vrtice a uma distncia
k + 1.
O grafo G(V, A) pode ser direcionado ou no
direcionado.
49
Busca em Largura
Cada vrtice colorido de branco, cinza ou
preto.
Todos os vrtices so inicializados branco.
Quando um vrtice descoberto pela
primeira vez ele torna-se cinza.
Vrtices cinza e preto j foram descobertos,
mas so distinguidos para assegurar que a
busca ocorra em largura.
Se (u, v) A e o vrtice u preto, ento o
vrtice v tem que ser cinza ou preto.
Vrtices cinza podem ter alguns vrtices
adjacentes brancos, e eles representam a
fronteira entre vrtices descobertos e no
descobertos.
50
51
= 1;
= 2;
52
53
(a)
c(0)
b( )
b( )
p(0)
c(1)
b( )
b( )
b( )
b( )
c(1)
b( )
b( )
F 0
0
F 1 3
1 1
(c)
(d)
p(0)
p(1)
b( )
p(0)
p(1)
b( )
c(1)
c(2)
b( )
p(1)
c(2)
b( )
F 3 2
1 2
F 2
2
54
(f)
p(0)
p(1)
b( )
p(0)
p(1)
c(0)
p(1)
p(2)
b( )
p(1)
p(2)
b( )
F 4
0
(g)
(h)
p(0)
p(1)
p(0)
p(0)
p(1)
p(0)
p(1)
p(2)
c(1)
p(1)
p(2)
p(1)
F 5
1
55
56
Ordenao Topolgica
Ordenao linear de todos os vrtices, tal que
se G contm uma aresta (u, v) ento u
aparece antes de v.
Pode ser vista como uma ordenao de seus
vrtices ao longo de uma linha horizontal de
tal forma que todas as arestas esto
direcionadas da esquerda para a direita.
Pode ser feita usando a busca em
profundidade.
57
58
Ordenao Topolgica
Os grafos direcionados acclicos so usados
para indicar precedncias entre eventos.
Uma aresta direcionada (u, v) indica que a
atividade u tem que ser realizada antes da
atividade v.
1/18
16/17
19/20
4/5 3
2/15
7/12
3/14
6/13
8/11
9/10
Ordenao Topolgica
Algoritmo para ordenar topologicamente um
grafo direcionado acclico G = (V, A):
1. Aplicar a busca em profundidade no grafo
G para obter os tempos de trmino t[u]
para cada vrtice u.
2. Ao trmino de cada vrtice, insira-o na
frente de uma lista linear encadeada.
3. Retornar a lista encadeada de vrtices.
A Custo O(|V | + |A|), uma vez que a busca
em profundidade tem complexidade de tempo
O(|V | + |A|) e o custo para inserir cada um
dos |V | vrtices na frente da lista linear
encadeada custa O(1).
59
60
61
0,1,2
(a)
(b)
(c)
62
63
64
2/7
1/6
0
cruz
3
4/5
2
3/6
(a)
ret
arv
3/4
cruz
arv cruz
1
arv
3
2
cruz
7/8
2/5
(b)
ret
2
arv
1
(c)
65
66
Vertice : "+u) ;
i f ( ! grafo . listaAdjVazia (u ) ) {
Grafo. Aresta a = grafo . primeiroListaAdj (u) ;
while (a ! = null ) {
int v = a.v2 ( ) ;
i f ( t t . restantes [ v ] ) { this . visitaDfs ( grafo , v , t t ) ; }
a = grafo . proxAdj (u) ;
}
}
}
public void obterCfc ( ) {
BuscaEmProfundidade dfs = new BuscaEmProfundidade ( this . grafo ) ;
dfs .buscaEmProfundidade ( ) ;
TempoTermino t t = new TempoTermino ( this . grafo .numVertices ( ) ) ;
for ( int u = 0; u < this . grafo .numVertices ( ) ; u++) {
t t . t [u] = dfs . t (u ) ; t t . restantes [u] = true ;
}
Grafo grafoT = this . grafo . grafoTransposto ( ) ;
while ( t t .numRestantes > 0) {
int vRaiz = t t .maxTT ( ) ;
System. out . println ( "Raiz da proxima arvore : " + vRaiz ) ;
this . visitaDfs ( grafoT , vRaiz , t t ) ;
}
}
}
67
68
69
70
6
1
5
3
2
5
4
(a)
2
4
(b)
S = ;
return S ;
71
72
p
V
V V
5
2
p
3
V V
6 4
4
5
3
73
74
75
(b)
0
6
1
6
3
0
5
1
2
5
6
4
(c)
2
1
(d)
0
0
0
2
2
1
2
1
3
2
1
2
1
6
(e)
(f)
2
1
2
1
2
1
5
2
1
5
76
77
78
79
80
81
82
(b)
0
6
1
5
3
3
2
2
5
6
4
4
4
(c)
(d)
0
2
4
2
5
(e)
(f)
0
2
4
2
5
83
84
85
S = ;
2.
3.
4.
5.
6.
S = S + {(u, v)} ;
7.
conj . uniao ( u, v ) ;
86
87
Pk
i=1
p(vi1 , vi )
n
o
c
min p(c) : u ; v
se existir caminho de u a v
caso contrrio
88
89
90
91
Algoritmo de Dijkstra
Mantm um conjunto S de vrtices cujos
caminhos mais curtos at um vrtice origem
j so conhecidos.
Produz uma rvore de caminhos mais curtos
de um vrtice origem s para todos os vrtices
que so alcanveis a partir de s.
Utiliza a tcnica de relaxamento:
Para cada vrtice v V o atributo p[v]
um limite superior do peso de um caminho
mais curto do vrtice origem s at v.
O vetor p[v] contm uma estimativa de um
caminho mais curto.
O primeiro passo do algoritmo inicializar os
antecessores e as estimativas de caminhos
mais curtos:
antecessor[v] = null para todo vrtice
v V,
p[u] = 0, para o vrtice origem s, e
p[v] = para v V {s}.
92
Relaxamento
O relaxamento de uma aresta (u, v) consiste
em verificar se possvel melhorar o melhor
caminho at v obtido at o momento se
passarmos por u.
Se isto acontecer, p[v] e antecessor[v] devem
ser atualizados.
i f (p[ v] > p[u] + peso da aresta ( u, v) )
p[ v ] = p[u] + peso da aresta ( u, v ) ;
antecessor [ v ] = u;
93
2.
p[ v ] = I n f i n i t o ;
3.
antecessor [ v] = 1;
4.
p[ raiz ] = 0;
5.
S = ;
7.
8.
u = heap. retiraMin ( ) ;
S = S + u;
10.
11.
12.
13.
antecessor [ v ] = u;
94
95
(b)
0
1
1
10
4
3
1
5
2
10
4
(c)
10
6
3
0
0
1
1
10
4
3
1
5
2
6
10
6
Iterao
d[0]
d[1]
d[2]
d[3]
d[4]
(a)
(b)
{0}
10
(c)
{0, 1}
10
96
(e)
0
0
1
1
3
1
5
2
5
10
9
4
10
6
4
3
1
2
(f)
6
2
0
0
1
1
1
2
6
4
5
5
10
6
2
Iterao
d[0]
d[1]
d[2]
d[3]
d[4]
(d)
{0, 1, 3}
(e)
{0, 1, 3, 2}
(f)
{0, 1, 3, 2, 4}
Algoritmo de Dijkstra
Para realizar de forma eficiente a seleo de
uma nova aresta, todos os vrtices que no
esto na rvore de caminhos mais curtos
residem no heap A baseada no campo p.
Para cada vrtice v, p[v] o caminho mais
curto obtido at o momento, de v at o vrtice
raiz.
O heap mantm os vrtices, mas a condio
do heap mantida pelo caminho mais curto
estimado at o momento atravs do arranjo
p[v], o heap indireto.
o arranjo pos[v] fornece a posio do vrtice v
dentro do heap, permitindo assim que o
vrtice v possa ser acessado a um custo O(1)
para a operao diminuiChave.
97
98
99
100
101
102
103
104
105
(b)
arestas
1
2
4
1
2
3
4
prim
0
1
2
3
4
(1,2,0) (3,4,1) (3,5,2) (0,2,3) (2,3,4)
0
3
1
0
2
4
3
9
4
6
5
7
0 1 2 3 4 5 6 7 8
prox 1 1 1 1 8 1 1 1 5
9
2
106
107
108
109
}
}
public int numVertices ( ) { return this .numVertices ; }
}
110