Você está na página 1de 40

1

Jos Augusto Baranauskas


Departamento de Fsica e Matemtica FFCLRP-USP
augusto@ffclrp.usp.br
http://dfm.ffclrp.usp.br/~augusto
Algoritmos e
Estruturas de Dados II
Grafos Grafos
Nesta aula fornecido
um breve histrico sobre
a teoria dos grafos
So tambm
introduzidos conceitos
sobre grafos e
algoritmos que os
manipulam
2
Histrico Histrico
A primeira evidncia sobre grafos (graphs) remonta a
1736, quando Euler fez uso deles para solucionar o
problema clssico das pontes de Koenigsberg
Na cidade de Koenigsberg (na Prssia Oriental), o rio
Pregal flui em torno da ilha de Kneiphof, dividindo-se em
seguida em duas partes
Assim sendo, existem quatro reas de terra que ladeiam o
rio: as reas de terra (A-D) esto interligadas por sete
pontes (a-g)
O problema das pontes de Koenigsberg consiste em se
determinar se, ao partir de alguma rea de terra,
possvel atravessar todos os pontos exatamente uma vez,
para, em seguida, retornar rea de terra inicial
3
Histrico Histrico
possvel caminhar sobre cada ponte exatamente uma
nica vez e retornar ao ponto de origem?
A D
B
C c d
a
b
f
g
Rio Pregal
e
4
Histrico Histrico
Um caminho possvel consistiria em iniciar na rea de
terra B, atravessar a ponte a para a ilha A; pegar a ponte
e para chegar rea D, atravessar a ponte g, chegando a
C; cruzar a ponte d at A; cruzar a ponte b at B e a
ponte f, chegando a D
A
D
B
C c d
a
b
f
g
Rio Pregal
e
5
Histrico Histrico
Um caminho possvel consistiria em iniciar na rea de
terra B, atravessar a ponte a para a ilha A; pegar a ponte
e para chegar rea D, atravessar a ponte g, chegando a
C; cruzar a ponte d at A; cruzar a ponte b at B e a
ponte f, chegando a D
Esse caminho no atravessa todas as pontes uma vez,
nem tampouco retorna rea inicial de terra B
Euler provou que no possvel o povo de Koenigsberg
atravessar cada ponte exatamente uma vez, retornando
ao ponto inicial
Ele resolveu o problema, representando as reas de terra
como vrtices e as pontes como arestas de um grafo (na
realidade, um multigrafo)
6
Definio Definio
Um grafo G(V,E) composto de
V um conjunto no-vazio de vrtices
vrtice (vertex); vrtices (vertices, vertexes)
E um conjunto de arestas (edges), conectando os vrtices em
V
Uma aresta (u,v) um par de vrtices, ou seja, uV e vV
Usaremos a notao
V ou V(G) para representar o conjunto de vrtices de G
E ou E(G) para representar o conjunto de arestas de G
G ou G=(V,E) ou G(V,E) para representar um grafo
n = |V| o nmero de vrtices
e = |E| o nmero de arestas
Em geral, |A| indica a cardinalidade (nmero de
elementos) do conjunto A
2
7
Problema das Pontes de Problema das Pontes de
Koenigsberg Koenigsberg como um Grafo como um Grafo
C
B
A D
c d
a b
e
g
f
A
D
B
C c d
a
b
f
g
Rio Pregal
e
8
Problema das Pontes de Problema das Pontes de
Koenigsberg Koenigsberg como um Grafo como um Grafo
A soluo elegante e tem aplicao a todos os grafos
Definindo o grau de um vrtice como sendo o nmero de
arestas que lhe so incidentes, Euler mostrou que existe
um caminho com ponto de incio em qualquer vrtice, que
passa atravs de cada aresta exatamente uma vez e
termina no vrtice inicial contanto que o grau de cada
vrtice seja par
O caminho que cumprir com essas condies
denominado Euleriano
No existe nenhum caminho Euleriano nas pontes de
Koenigsberg, uma vez que todos os quatro vrtices tm
grau mpar
9
Exemplo Exemplo
V={a,b,c,d,e}
E={(a,b),(a,c),(a,d),
(b,e),(c,d),(c,e),
(d,e)}
Nmero de vrtices, n
n = |V| = 5
Nmero de arestas, e
e = |E| = 7
a b
d e
c
10
Aplicaes Aplicaes
Anlise de circuitos eltricos
Verificao de caminhos mais curtos
Anlise de planejamento de projetos (scheduling)
Identificao de compostos qumicos
Gentica
Ciberntica
Lingstica
Cincias Sociais, etc
Pode-se afirmar que de todas as estruturas
matemticas, grafos so as que se encontram
em uso mais amplo
11
Terminologia Terminologia
Em um grafo no-orientado (ou no-dirigido),
no h ordenao especial no par de vrtices
que representam qualquer aresta
Assim sendo, os pares (u,v) e (v,u) representam a
mesma aresta
Num grafo orientado (ou dirigido ou dgrafo)
cada aresta representada por um par dirigido
(u,v), onde u o incio e v o trmino da aresta
Assim sendo (u,v) e (v,u) representam duas arestas
distintas
12
Terminologia Terminologia
Os grafos G
1
e G
2
so no-orientados
O grafo G
3
um grafo orientado (dgrafo)
Observe que as arestas de um grafo orientado so
desenhadas com uma seta que vai do incio at o trmino
1
2 3
4
1
2
4
1
5
2
3
3
6 7
G
2
G
3
G
1
3
13
Terminologia Terminologia
V(G
1
)={1,2,3,4}; E(G
1
)={(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)}
V(G
2
)={1,2,3,4,5,6,7};
E(G
2
)={(1,2),(1,3),(2,4),(2,5),(3,6),(3,7)}
V(G
3
)={1,2,3}; E(G
3
)={(1,2), (2,1), (2,3)}
1
2 3
4
1
2
4
1
5
2
3
3
6 7
G
2
G
3
G
1
14
Terminologia Terminologia
O grafo G
2
tambm uma rvore, ao passo
que os grafos G
1
e G
3
no so
1
2 3
4
1
2
4
1
5
2
3
3
6 7
G
2
G
3
G
1
15
Terminologia Terminologia
As rvores podem ser definidas como sendo
casos especiais de grafos (veremos isso mais
adiante)
Vamos precisar que se (v
i
,v
j
) ou (v
j
,v
i
) uma
aresta em E(G), ento v
i
v
j
Uma vez que E(G) um conjunto, um grafo no
pode ter ocorrncias mltiplas da mesma aresta
Quando h mais de uma ocorrncia de uma mesma
aresta, o objeto de dados denominado multigrafo
O mesmo valido para V(G), ou seja, no h
ocorrncias mltiplas de um mesmo vrtice
16
Nmero Mximo de Arestas Nmero Mximo de Arestas
O nmero de pares diferentes no-ordenados
(v
i
,v
j
) com v
i
v
j
em um grafo com n vrtices
n*(n-1)/2
Assim, o nmero mximo de arestas em qualquer
grafo no-orientado com n vrtices n*(n-1)/2
Um grafo no-orientado com n vrtices e com
exatamente n*(n-1)/2 arestas denominado
completo; caso contrrio denominado
incompleto (ou no-completo)
Para o caso de um grafo orientado com n
vrtices, o nmero mximo de arestas n*(n-1)
17
Nmero Mximo de Arestas Nmero Mximo de Arestas
Intuitivamente, em um grafo completo com n
vrtices, cada um dos n vrtices incidente a (n-
1) arestas; assim, cada aresta contada duas
vezes, ou seja, resultando em n*(n-1)/2
1
2
5
4
3
1
2
3
4
18
Nmero Mximo de Arestas em Nmero Mximo de Arestas em
uma rvore uma rvore
Uma rvore com n vrtices possui exatamente
(n-1) arestas
1
2
4 5
3
6 7
4
5
1 2
3
rvore
1
rvore
2
4
19
Grafos Completo e Incompleto Grafos Completo e Incompleto
G
1
o grafo completo com 4 vrtices,
enquanto que G
2
e G
3
so grafos
incompletos
1
2 3
4
1
2
4
1
5
2
3
3
6 7
G
2
G
3
G
1
20
Grafos Completos Grafos Completos
Em geral, K
n
denota o grafo completo com
n vrtices
1 1
2
1 3
2
1
2
3
4
1
2
5
4
3
K
1
K
2
K
3
K
4 K
5
21
Vrtices Adjacentes Vrtices Adjacentes
Sendo (u,v) uma aresta em E(G), dizemos
que os vrtices u e v so adjacentes e que
a aresta (u,v) incidente nos vrtices u e
v
1
2 3
4
1
2
4
1
5
2
3
3
6 7
G
2
G
3
G
1
22
Vrtices Adjacentes Vrtices Adjacentes
Os vrtices adjacentes ao vrtice 3 em G
2
so 1,
6 e 7
Em G
3
, as arestas incidentes ao vrtice 2 so
(1,2), (2,1) e (2,3)
1
2 3
4
1
2
4
1
5
2
3
3
6 7
G
2
G
3
G
1
23
Grau Grau
O grau de um vrtice v, escrito como grau(v), o nmero
de arestas incidentes no vrtice v
Caso G seja um grafo orientado:
o grau de entrada de um vrtice v definido como sendo o
nmero de arestas para as quais v seja o trmino
o grau de sada o nmero de arestas para as quais v o incio
Em grafo G com n vrtices {v
1
, v
2
, ..., v
n
} e e arestas,
fcil perceber que
No restante desta apresentao vamos nos referir a um
grafo orientado como dgrafo; um grafo no-orientado
ser, por vezes, chamado simplesmente de um grafo

=
=
n
i
i
v grau e
1
) (
2
1
24
Grau Grau
O grau de vrtice 1 em G
1
3
O vrtice 2 de G
3
tem grau de entrada igual a 1,
grau de sada igual a 2 e grau igual a 3
1
2 3
4
1
2
4
1
5
2
3
3
6 7
G
2
G
3
G
1
5
25
Subgrafo Subgrafo
Um subgrafo de G um grafo G' tal que
V(G') V(G) e E(G') E(G)
1
2 3
4
1
2 3 2 3
4
Subgrafos de G
1
1
2 3
4
1
G
1
26
Subgrafo Subgrafo
Um subgrafo de G(V,E) um grafo
G(V,E) tal que V(G') V(G) e E(G')
E(G)
Subgrafos de G
3
1
2
3
G
3
1
2
3
1
2
3
1
2 2
27
Clique Clique
O clique de um grafo G um subgrafo de
G que seja completo
1
2
3
4
G
1
2
3
clique de G
28
Caminho Caminho
Um caminho (path) do vrtice v
p
para o vrtice v
q
no grafo G uma seqncia de vrtices v
p
, v
i1
,
v
i2
, ...,v
in
, v
q
de tal maneira que (v
p
,v
i1
), (v
i1
,v
i2
),
...,(v
in
,v
q
) so arestas em E(G)
O comprimento (ou tamanho) de um caminho
o nmero de arestas que ele contm
Um caminho simples um caminho em que so
diferentes todos os vrtices, com a possvel
exceo do primeiro e o do ltimo
Um ciclo um caminho simples em que o
primeiro e o ltimo vrtices so iguais
Um trajeto um caminho no qual todas as
arestas so distintas
29
Caminho Caminho
a b
d e
c
a b
d e
c
Caminho: a,b,e,d,c
Tamanho: 4
Ciclo: c,e,d,c
Tamanho: 3
30
Caminho Caminho
O caminho (1,2),(2,4),(4,3) em G
1
, tambm escrito como
1,2,4,3, caminho simples ao passo que (1,2),(2,4),(4,2)
escrito como 1,2,4,2 tambm um caminho em G
1
, mas
no um caminho simples
Ambos caminhos tm comprimento 3 em G
1
1
2 3
4
1
2
4
1
5
2
3
3
6 7
G
2
G
3
G
1
6
31
Caminho Caminho
1,2,3 um caminho simples orientado em G
3
1,2,3,2 no um caminho em G
3
, uma vez que a
aresta (3,2) no se encontra em E(G
3
)
1
2 3
4
1
2
4
1
5
2
3
3
6 7
G
2
G
3
G
1
32
Ciclo Ciclo
1,2,3,1 um ciclo em G
1
1,2,1 um ciclo orientado em G
3
Normalmente, para grafos orientados, acrescentamos o
termo "orientado" aos termos ciclo e caminho
1
2 3
4
1
2
4
1
5
2
3
3
6 7
G
2
G
3
G
1
33
Caminhos Caminhos Hamiltoniano Hamiltoniano e e Euleriano Euleriano
Caminho ou Ciclo Hamiltoniano
um caminho que contm
cada vrtice do grafo
exatamente uma vez.
Um ciclo v
1
, ..., v
k
, v
k+1

hamiltoniano quando o
caminho v
1
, ..., v
k
o for
Caminho ou Ciclo Euleriano
um caminho que contm
cada aresta do grafo
exatamente uma vez
caminho hamiltoniano 3, 4, 5, 2,
1, 6
caminho euleriano 3, 4, 5, 3, 2,
5, 6, 2, 1, 6
1
4
2 6
3 5
34
Vrtices e Grafos Interligados Vrtices e Grafos Interligados
Em um grafo no-orientado G dois vrtices v
p
e
v
q
se dizem interligados se houver um caminho
em G desde v
p
at v
q
(uma vez que G no
orientado, isto significa que h tambm um
caminho desde v
q
at v
p
)
Um grafo no-orientado se diz interligado
(conexo) se para cada par de vrtices individuais
v
i
e v
j
em V(G) existe um caminho desde v
i
at v
j
em G; caso contrrio G no-interligado
(desconexo)
Assim, se e<(n-1) ento G desconexo, onde
e=|E(G)|, n=|V(G)|
35
Vrtices e Grafos Interligados Vrtices e Grafos Interligados
Os grafos G
1
e G
2
so conexos (interligados) ao
passo que G
4
no o
1
2 3
4
1
2
4 5
3
6 7
G
2
1
2 3
4
G
4
5
6 7
8
G
1
36
Componente Conexo Componente Conexo
Um componente conexo, ou simplesmente um
componente de grafo no-orientado, um subgrafo
interligado ao mximo
No exemplo, G
4
tem dois componentes H
1
e H
2
1
2 3
4
G
4 5
6 7
8
H
2
H
1
7
37
Componente Conexo Componente Conexo
Uma rvore um grafo conexo sem ciclos
(acclico)
Uma floresta uma coleo de rvores
1
2 3
5
4
12
11
13
10
14
18 17 15
16 19
9
8
7
6
20
rvore
rvore
rvore
rvore
38
Componente Conexo Componente Conexo
Uma rvore um grafo conexo sem ciclos
(acclico)
Uma floresta uma coleo de rvores
1
2 3
5
4
12
11
13
10
14
18 17 15
16 19
9
8
7
6
20
rvore
rvore
rvore
rvore
Floresta
39
rvore um Grafo Conexo Acclico rvore um Grafo Conexo Acclico
Teorema:
Um grafo G uma rvore se e somente se existir um nico
caminho entre cada par de vrtices G
Prova:
Se G uma rvore ento G conexo
Portanto existe pelo menos um caminho entre cada par de
vrtices v e w de G
Suponha que existem dois caminhos distintos (v,P
1
,w) e (v,P
2
,w)
entre v e w; ento o caminho (v,P
1
,w,P
2
,v) forma um ciclo, o que
contradiz G ser acclico
Reciprocamente, se existe exatamente um caminho entre cada
par de vrtices de G, ento o grafo obviamente conexo, e alm
disso no pode conter ciclos
Portanto, G uma rvore
40
Componente Conexo Componente Conexo
Um grafo orientado G se diz fortemente
conexo (fortemente interligado) se para
cada par de vrtices diferentes v
i
e v
j
em
V(G) existe um caminho orientado desde v
i
at v
j
e tambm de v
j
para v
i
Um componente fortemente interligado
um subgrafo mximo fortemente
interligado
41
Componente Conexo Componente Conexo
O grafo G
3
no est fortemente interligado, uma
vez que no existe nenhum caminho de v
3
at v
2
G
3
tem dois componentes fortemente interligados
1
2
3
G
3
1
2
Componentes de G
3
fortemente interligados
3
42
Distncia Distncia
A distncia d(v,w) entre dois vrtices v e w de
um grafo o tamanho do menor caminho entre v
e w
No exemplo, d(1,4) = 1
1
2 3
4
G
1
8
43
Excentricidade Excentricidade
A excentricidade de um vrtice v a
distncia mxima entre v e w, para todo w
de V(G)
7
1 2
4 3
5 6
3 7
3 6
2 5
2 4
2 3
3 2
3 1
Excentricidade Vrtice
44
Centro Centro
O centro de um grafo G o subconjunto
de vrtices de excentricidade mnima
No exemplo, centro(G)={3,4,5}
7
1 2
4 3
5 6
3 7
3 6
2 5
2 4
2 3
3 2
3 1
Excentricidade Vrtice
45
Subgrafo Subgrafo e rvore de Cobertura e rvore de Cobertura
O subgrafo de espalhamento (spanning graph),
ou subgrafo gerador ou subgrado estendido,
de um grafo G
1
(V
1
,E
1
) um subgrafo G
2
(V
2
,E
2
)
de G
1
, onde V
1
= V
2
Quando o subgrafo de espalhamento uma
rvore, ele recebe o nome de rvore de
espalhamento, ou rvore geradora ou rvore
estendida (spanning tree)
Dessa forma, a rvore de geradora de um grafo
G uma rvore contendo todos os vrtices de G
Um grafo G pode possuir vrias rvores de
cobertura
46
Subgrafo Subgrafo e rvore de Cobertura e rvore de Cobertura
G
2
, G
3
e G
4
so subgrafos de cobertura de G
1
G
3
e G
4
so subgrafos de cobertura de G
2
G
4
subgrafo de cobertura de G
3
G
4
rvore de cobertura de G
1
, G
2
e G
3
1
2 3
4
G
1
1
2 3
4
G
2
1
2 3
4
G
3
1
2 3
4
G
4
47
rvore de Cobertura rvore de Cobertura
Todo grafo conexo G(V,E) possui uma
rvore de cobertura que pode ser obtida da
seguinte forma
Para cada aresta (u,v) E(G)
Se G(V,E-{(u,v)}) for conexo ento remova (u,v) de
G
Quando todas as arestas que
permanecerem tiverem sido consideradas,
o grafo resultante uma rvore de
cobertura de G
48
Planaridade Planaridade
Seja G um grafo e uma representao geomtrica de G
em um plano (duas dimenses)
A representao denominada plana quando no houver
cruzamento de linhas (exceto nos vrtices)
Um grafo denominado planar se possuir pelo menos
uma representao plana
As linhas de representao dividem o plano em regies,
denominadas faces
Existe exatamente uma regio ilimitada (chamada face externa)
Duas representaes planas de um mesmo grafo possuem
sempre o mesmo nmero de faces
Todo grafo planar admite uma representao plana em
que todas as linhas so retas
9
49
Planaridade Planaridade
Se G um grafo planar ento n+f = e+2
n=|V|, e=|E|, f o nmero de faces
Se G um grafo planar ento e 3*n-6
Assim, quanto maior o nmero de arestas em relao ao
nmero de vrtices, mais difcil se torna obter
representaes planas
1 1
2
1 3
2
K
1
K
2
K
3
K
1
, K
2
e K
3
so
planares
50
Planaridade Planaridade
Se G um grafo planar ento n+f = e+2
n=|V|, e=|E|, f o nmero de faces
Se G um grafo planar ento e 3*n-6
K
4
planar
1
2
3
4
K
4
1
2
3
4
K
4
1
2
3
4
K
4
Representao
no planar
Representao
planar
Representao
planar com todas linhas retas
51
Planaridade Planaridade
Se G um grafo planar ento n+f = e+2
n=|V|, e=|E|, f o nmero de faces
Se G um grafo planar ento e 3*n-6
K
5
no planar
1
2
5
4
3
K
5
1
2
5
4
3
K
5
52
Planaridade Planaridade
Se G um grafo planar ento n+f = e+2
n=|V|, e=|E|, f o nmero de faces
Se G um grafo planar ento e 3*n-6
G no planar
1 2 3
G
4 5 6
53
Colorao Colorao
Uma colorao de G(V,E) uma atribuio de
alguma cor para cada vrtice de V, de forma que
dois vrtices adjacentes possuam cores distintas
Uma k-colorao uma colorao que utiliza um
mximo de k cores
O nmero cromtico de um grafo G nmero
mnimo de cores k para o qual existe uma k-
colorao de G
Colorir um grafo simples, entretanto no trivial
encontrar um algoritmo eficiente para obteno
do nmero cromtico; na realidade ainda
desconhecido um algoritmo eficiente para isso
54
Colorao Colorao
Numero cromtico de G
1
= 4; G
2
= 3, G
3
=
2; G
4
= 2
1
2 3
4
1
2
4 5
3
6 7
G
4
G
1
1
2 3
4
G
2
1
2 3
4
G
3
10
55
Colorao Colorao
O problema das 4 cores, ou colorao de mapas
usando quatro cores, data de 1852 quando o ingls
Francis Guthrie observou que apenas quatro cores eram
suficientes para colorir o mapa dos condados da
Inglaterra
O problema das 4 cores consiste em colorir os pases de
um mapa arbitrrio plano, cada pas com uma cor, de tal
forma que pases fronteirios possuam cores diferentes,
usando no mximo 4 cores, teorema provado em 1977
por Appel e Haken
Desde a prova do teorema, os algoritmos mais eficientes
encontrados para 4-colorao de mapas quererem O(n
2
),
onde n o nmero de vrtices
56
Colorao Colorao
Cada regio do mapa substituda por um vrtice
Dois vrtices so conectados por uma aresta se e
somente se as duas regies so fronteirias
(compartilham um segmento de borda)
1
2
4
3

1
2
4
3
57
Especificao Especificao
bool Graph::Empty();
retorna true se o grafo est vazio; false caso contrrio
int Graph::numVertices();
Retorna o nmero de vrtices
int Graph::numEdges();
Retorna o nmero de arestas
int Graph::Size();
Retorna o nmero de vrtices mais arestas
vertex Graph::Vertex(int i)
Retorna o i-simo vrtice, 1 <= i <= numVertices()
edge Graph::Edge(int j)
Retorna a j-sima aresta , 1 <= j <= numEdges()
58
Especificao Especificao
float Graph::distance(vertex v, vertex w)
Retorna a distncia entre os vrtices v e w
int Graph::degree(vertex v)
Retorna o grau de v
int Graph::inDegree(vertex v)
Retorna o grau de entrada de v
int Graph::outDegree(vertex v)
Retorna o grau de sada de v
edges Graph::incidentEdges(vertex v)
Retorna uma enumerao de todas as arestas incidentes ao vrtice v
edges Graph::inIncidentEdges(vertex v)
Retorna uma enumerao de todas as arestas que chegam no vrtice v
edges Graph::outIncidentEdges(vertex v)
Retorna uma enumerao de todas as arestas que partem do vrtice v
59
Especificao Especificao
vertices Graph::adjacentVertices(vertex v)
Retorna uma enumerao dos vrtices adjacentes a v
vertices Graph::inAdjacentVertices(vertex v)
Retorna uma enumerao dos vrtices adjacentes a v considerando arestas que
chegam a v
vertices Graph::outAdjacentVertices(vertex v)
Retorna uma enumerao dos vrtices adjacentes a v considerando arestas que
partem de v
bool Graph::areAdjacent(vertex v, vertex w)
Retorna true se os vrtices v e w so adjacentes, false caso contrrio
vertex Graph::insertVertex(object o)
Insere e retorna um novo (isolado) vrtice, armazenando o na sua posio
edge Graph::insertEdge(vertex v, vertex w, object o)
Insere e retorna uma aresta no orientada entre v e w, armazenando o na sua
posio
edge Graph::insertDirectedEdge(vertex v, vertex w, object o)
Insere e retorna uma aresta orientada entre v e w, armazenando o na sua posio
void Graph::removeEdge(edge e)
Remove aresta e
60
Representao Representao
Embora sejam possveis diversas
representaes dos grafos, vamos estudar
duas mais utilizadas comumente
matriz de adjacncia e
lista de adjacncias
A escolha de determinada representao
depender da aplicao que se tem em
vista e das funes que se espera realizar
no grafo
11
61
Matriz de Adjacncias Matriz de Adjacncias
Seja G=(V,E) um grafo com n vrtices, n1
A matriz de adjacncias A de G um arranjo
bidimensional n x n com a propriedade de que
A[i,j] = 1 se a aresta (v
i
,v
j
) pertence a E(G)
A[i,j] = 0 caso contrrio
A matriz de adjacncias para um grafo no-orientado
simtrica, pois a aresta (v
i
,v
j
) est em E(G), se a aresta
(v
j
,v
i
) tambm est em E(G)
A matriz de adjacncias de um grafo orientado no
necessariamente simtrica
O espao necessrio para representar um grafo usando a
matriz de adjacncias de n
2
bits
Aproximadamente metade desse espao pode ser poupado no
caso dos grafos no-orientados, armazenando apenas o tringulo
superior ou inferior da matriz
62
Matriz de Adjacncias Matriz de Adjacncias
0
1
1
1
4
1 1 1 4
0 1 1 3
1 0 1 2
1 1 0 1
3 2 1
1
2 3
4
G
1
0
1
0
3
0 0 3
0 1 2
1 0 1
2 1
1
2
3
G
3
63
Matriz de Adjacncias Matriz de Adjacncias
1
2
4 5
3
6 7
G
2
1
1
0
0
0
0
1
3
0
0
0
0
0
1
0
4
0
0
0
0
0
1
0
5
1 1 0 1 3
0 0 1 0 4
0 0 1 0 5
0 0 0 0 6
0
0
0
7
0 0 0 7
0 0 1 2
0 1 0 1
6 2 1
64
Matriz de Adjacncias Matriz de Adjacncias
0
1
0
1
0
0
0
0
6
0 1 1 0 0 0 0 6
0
0
0
1
0
0
1
3
0
0
0
0
1
1
0
4
0
0
0
0
0
0
0
5
0 0 0 1 3
0 0 1 0 4
0 0 0 0 5
1 0 0 0 7
0
0
0
8
1 0 0 8
0 0 1 2
0 1 0 1
7 2 1
1
2 3
4
G
4
5
6 7
8
65
Matriz de Adjacncias Matriz de Adjacncias
A partir da matriz de adjacncias possvel
determinar se existe uma aresta que liga
quaisquer dois vrtices v
i
e v
j
Para um grafo no-orientado, o grau de qualquer
vrtice v
i
vem a ser a soma de sua linha:
Para um grafo orientado, a soma da linha o
grau de sada ao passo que a soma da coluna
vem a ser o valor grau de entrada

=
n
j
j i A
1
] , [
66
Matriz de Adjacncias Matriz de Adjacncias
Suponha que queremos responder perguntas sobre
grafos tais como:
Quantas arestas existem em G?
Ser que G est interligado?
Usando as matrizes de adjacncias, todos os algoritmos
vo exigir, pelo menos, O(n
2
) de tempo uma vez que (n
2
-
n) entradas da matriz (a diagonal principal possui
somente zeros) tm de ser examinadas
Se o grafo for esparso, isto , quando a maioria dos
termos na matriz de adjacncias for zero, possvel
responder as perguntas acima em tempo O(n+e), onde e
o nmero de arestas em G e e << n
2
/2
Esse aceleramento pode ser possibilitado mediante a
utilizao de listas ligadas, nas quais so representadas
apenas as arestas existentes em G, o que nos leva
prxima representao para grafos
12
67
Lista de Adjacncias Lista de Adjacncias
Nesta representao as n linhas da matriz de
adjacncias so representadas como n listas
encadeadas, ou seja, existe uma lista para cada
vrtice em G
Os ns na lista i representam os vrtices que so
adjacentes ao vrtice v
i
Cada n possui, pelo menos, dois campos
Um campo que contm o ndice do vrtice adjacente
ao vrtice v
i
Um campo de ligao com o prximo vrtice adjacente
ao vrtice v
i
68
Lista de Adjacncias Lista de Adjacncias
1
2 3
4
G
1
2 3
4
3
2
1 4
1 3 4
1 2 4
1 2 3
N de
cabealho
N de lista
69
Lista de Adjacncias Lista de Adjacncias
G
3
2
3
2
1
1 3
1
2
3
70
Lista de Adjacncias Lista de Adjacncias
1
2
4 5
3
6 7
G
2
2
7
6
5
4
3
2
1
2
3
3
2 3
1 4 5
1 6 7
71
Lista de Adjacncias Lista de Adjacncias
1
2 3
4
G
4
5
6 7
8
8
7
6
5
4
3
2
1
7
2 3
1 4
1 4
6
2 3
5 7
6 8
72
Lista de Adjacncias Lista de Adjacncias
Cada lista possui um n de cabealho (incio ou head da
lista)
Os ns de cabealho so seqenciais, permitindo fcil acesso
aleatrio lista de adjacncias de determinado vrtice
No caso de um grafo no-orientado com n vrtices e a
arestas, essa representao requer n ns de cabealho e
2*a ns de lista, sendo que cada n de lista possui 2
campos (vrtice adjacente + ligao)
Em termos de quantidade de bits de memria necessria,
essa contagem deve ser multiplicada por log
2
(n) para os
ns de cabealho e por log2(n)+log2(a) para os ns de
lista, uma vez que so necessrios Iog
2
(x) bits para
representar um nmero de valor x
Em alguns casos os ns podem ser condensados
seqencialmente nas listas de adjacncias eliminando-se
os campos de ligao
13
73
Lista de Adjacncias Lista de Adjacncias
O grau de qualquer vrtice em um grafo no-
orientado pode ser determinado simplesmente
contando o nmero de ns na respectiva lista de
adjacncias
Portanto, o nmero total de arestas pode ser
determinado em tempo O(n+e)
No caso de um dgrafo, o nmero total de arestas
corresponde ao nmero de ns de lista
O grau-de-sada de qualquer vrtice pode ser
determinado contando o nmero de ns na lista
de adjacncias
O nmero total de arestas em G pode, portanto,
ser determinado em O(n+e)
74
Lista de Adjacncias Lista de Adjacncias
Determinar o grau de entrada de um vrtice uma tarefa
um pouco mais complexa, havendo necessidade de ter
acesso repetidamente a todos os vrtices adjacentes a
outro vrtice
Assim, talvez seja conveniente o esforo de manter outro
conjunto de listas, alm das listas de adjacncias
Esse conjunto de listas, chamado de listas de
adjacncia inversa, conter uma lista para cada vrtice
Cada vrtice conter um n para cada vrtice adjacente ao vrtice
que representa
Alternativamente, pode-se adotar Listas Cruzadas,
estrutura tambm utilizada para a representao de
matrizes esparsas
75
Lista de Adjacncias Inversa Lista de Adjacncias Inversa
G
3
2
3
2
1
1 3
1
2
3
2
3
2
1
1
2
Lista de Adjacncias
(arestas que partem de cada n)
Lista de Adjacncias Inversa
(arestas que chegam em cada n)
76
Representao Representao
Em algumas situaes so atribudos pesos s
arestas de um grafo
Esses pesos podem representar a distncia de
um vrtice para outro ou o custo de se passar de
um vrtice para outro adjacente
Neste caso as entradas da matriz de adjacncias
A[i,j] mantm tambm essas informaes
No caso das listas de adjacncias, essa
informao sobre pesos pode ser conservada
nos ns de listas, incluindo um campo adicional
Um grafo com arestas dotadas de pesos
denominado rede ou grafo ponderado
77
Busca Busca
Partindo-se do n de raiz de uma rvore binria,
uma das coisas que se efetua de forma muito
freqente atravessar a rvore e visitar os ns
em alguma seqncia
Por exemplo, as trs maneiras bsicas de fazer isto
so: pr-ordem, em-ordem e ps-ordem
Um problema anlogo ocorre em grafos: sendo
G(V,E) um grafo no-orientado e um vrtice v em
V(G), estamos interessados em visitar todos os
vrtices em G que so alcanveis a partir de v
(isto , todos os vrtices interligados a v)
78
Busca em Grafos Busca em Grafos
Seja G um grafo conexo em que todos os seus
vrtices se encontram desmarcados
Inicialmente, marca-se um vrtice
arbitrariamente escolhido
Aps isso, seleciona-se algum vrtice v que
esteja marcado e seja incidente a alguma aresta
(v,w) ainda no selecionada
A aresta (v,w) torna-se ento selecionada e o
vrtice w marcado (caso ainda no o seja)
O processo termina quando todas as arestas de
G tiverem sido selecionadas
14
79
Busca em Grafos Busca em Grafos
Quando a aresta (v,w) selecionada a partir do
vrtice marcado v, diz-se que (v,w) foi visitada
(ou explorada) e o vrtice w foi alcanado
Um vrtice torna-se visitado (ou explorado)
quando todas as arestas incidentes a ele tiverem
sido exploradas
Assim, durante o processo de explorao de um
vrtice possvel que este venha a ser alcanado
diversas vezes
O vrtice inicial denominado raiz da busca
80
Busca em Grafos Busca em Grafos
procedure GeneralSearch
escolher e marcar um vrtice inicial (raiz da
busca);
while existe algum vrtice v marcado e incidente a
uma aresta (v,w) no explorada do
escolher o vrtice v;
visitar a aresta (v,w);
if w no est marcado then
marcar w;
endif
endwhile
end GeneralSearch
1
2 3
4
1
2
4
1
5
2
3
3
6 7
G
2
G
3
G
1
81
Busca em Grafos Busca em Grafos
Na busca geral, a escolha do prximo
vrtice e da aresta a ser visitada arbitrria
Nos critrios de busca em profundidade e
busca em largura a escolha do prximo
vrtice torna-se nica
Entretanto, a escolha do vrtice inicial e aresta
incidente permanece arbitrria
82
Busca em Grafos Busca em Grafos
Busca em Profundidade (depth first search)
Uma busca dita em profundidade quando o critrio de escolha
do vrtice marcado (a partir do qual ser realizada a prxima
visita de aresta) obedecer ao seguinte: Dentre todos os vrtices
marcados e incidentes a alguma aresta ainda no visitada,
escolher aquele mais recentemente alcanado na busca
Busca em Largura (breadth first search)
Uma busca dita em largura quando o critrio de escolha do
vrtice marcado (a partir do qual ser realizada a prxima visita
de aresta) obedecer ao seguinte: Dentre todos os vrtices
marcados e incidentes a alguma aresta ainda no visitada,
escolher aquele menos recentemente alcanado na busca
83
Busca em Profundidade Busca em Profundidade
A pesquisa em profundidade de um grafo se
realiza da seguinte maneira:
Visita-se o vrtice inicial v
Em seguida um vrtice no visitado w, adjacente a v,
selecionado iniciando-se uma pesquisa em
profundidade, a partir de w
Atingindo-se um vrtice u tal que tenham sido visitados
todos seus vrtices adjacentes, voltamos para o ltimo
vrtice visitado que tem vrtice w no visitado
adjacente ao mesmo e iniciamos uma pesquisa em
profundidade a partir de w
A busca termina quando nenhum vrtice no
visitado pode ser atingido de qualquer um
daqueles que foram visitados
84
Busca em Profundidade Busca em Profundidade
d f e
a
b
c
g
h
i j
k
Inserir na frente, remover da frente: a
15
85
Busca em Profundidade Busca em Profundidade
d f e
a
b
c
g
h
i j
k
Inserir na frente, remover da frente: b, c
86
Busca em Profundidade Busca em Profundidade
d f e
a
b
c
g
h
i j
k
Inserir na frente, remover da frente: d, e, c
87
Busca em Profundidade Busca em Profundidade
d f e
a
b
c
g
h
i j
k
Inserir na frente, remover da frente: h, e, c
88
Busca em Profundidade Busca em Profundidade
d f e
a
b
c
g
h
i j
k
Inserir na frente, remover da frente: e, c
89
Busca em Profundidade Busca em Profundidade
d f e
a
b
c
g
h
i j
k
Inserir na frente, remover da frente: i, j, c
90
Busca em Profundidade Busca em Profundidade
d f e
a
b
c
g
h
i j
k
Inserir na frente, remover da frente: j, c
16
91
Busca em Profundidade Busca em Profundidade
d f e
a
b
c
g
h
i j
k
Inserir na frente, remover da frente: c
92
Busca em Profundidade Busca em Profundidade
d f e
a
b
c
g
h
i j
k
Inserir na frente, remover da frente: f, g
93
Busca em Profundidade Busca em Profundidade
d f e
a
b
c
g
h
i j
k
Inserir na frente, remover da frente: k, g
94
Busca em Profundidade Busca em Profundidade
d f e
a
b
c
g
h
i j
k
Inserir na frente, remover da frente: g
95
Busca em Profundidade Busca em Profundidade
d f e
a
b
c
g
h
i j
k
Ordem de visita partindo do vrtice a: a,b,d,h,e,i,j,c,f,g,k
96
Exerccio Exerccio
Fornea a ordem em que
so visitados os vrtices
do grafo ao lado usando
busca em profundidade
(caso um vrtice tenha
mais de um vrtice
adjacente a ele, visite
primeiro os vrtices de
menor nmero),
assumindo a raiz da
busca como:
vrtice 1
vrtice 4
1
2
4 5
3
6 7
G
2
17
97
Soluo Soluo
Fornea a ordem em que
so visitados os vrtices
do grafo ao lado usando
busca em profundidade
(caso um vrtice tenha
mais de um vrtice
adjacente a ele, visite
primeiro os vrtices de
menor nmero),
assumindo a raiz da
busca como:
vrtice 1
1,2,4,5,3,6,7
vrtice 4
4,2,1,3,6,7,5
1
2
4 5
3
6 7
G
2
1
2
4
5
3
6 7
G
2
98
Algoritmo de Busca em Algoritmo de Busca em
Profundidade Profundidade
// Dado um grafo G=(V,E) com n vrtices e arranjo
VISITED[1..n] zerado inicialmente, este algoritmo
visita em profundidade todos os vrtices
alcanveis a partir de v
procedure DepthFirstSearch(v)
VISITED[v] true; // marque v como visitado
for cada vrtice w adjacente a v do
if not VISITED[w] then
DepthFirstSearch(w);
endif
next w
end DepthFirstSearch
100
Algoritmo de Busca em Algoritmo de Busca em
Profundidade Profundidade
procedure DepthFirstSearch(v)
VISITED[v] true; // marque v como visitado
for cada vrtice w adjacente a v do
if not VISITED[w] then
DepthFirstSearch(w)
endif
next w
end DepthFirstSearch
// procedimento que chama DepthFirstSearch
for i 1 to n do
VISITED[i] false;
next i
escolher vrtice raiz da busca, v;
DepthFirstSearch(v);
102
Algoritmo de Busca em Algoritmo de Busca em
Profundidade Profundidade
Como pode ser observado, o algoritmo de busca
em profundidade possui uma chamada recursiva
no final
Portanto o algoritmo recursivo pode ser
substitudo por uma verso iterativa por meio do
uso de uma pilha
Alm disso, as arestas de retorno tambm podem
ser visitadas estendendo o algoritmo fornecido
A implementao dessas alteraes deixada
como exerccio
103
Busca em Largura Busca em Largura
d f e
a
b
c
g
h
i j
k
Inserir no final, remover da frente: a
104
Busca em Largura Busca em Largura
d f e
a
b
c
g
h
i j
k
Inserir no final, remover da frente: b, c
18
105
Busca em Largura Busca em Largura
d f e
a
b
c
g
h
i j
k
Inserir no final, remover da frente: c, d, e
106
Busca em Largura Busca em Largura
d f e
a
b
c
g
h
i j
k
Inserir no final, remover da frente: d, e, f, g
107
Busca em Largura Busca em Largura
d f e
a
b
c
g
h
i j
k
Inserir no final, remover da frente: e, f, g, h
108
Busca em Largura Busca em Largura
d f e
a
b
c
g
h
i j
k
Inserir no final, remover da frente: f, g, h, i, j
109
Busca em Largura Busca em Largura
d f e
a
b
c
g
h
i j
k
Inserir no final, remover da frente: g, h, i, j, k
110
Busca em Largura Busca em Largura
d f e
a
b
c
g
h
i j
k
Inserir no final, remover da frente: h, i, j, k
19
111
Busca em Largura Busca em Largura
d f e
a
b
c
g
h
i j
k
Inserir no final, remover da frente: i, j, k
112
Busca em Largura Busca em Largura
d f e
a
b
c
g
h
i j
k
Inserir no final, remover da frente: j, k
113
Busca em Largura Busca em Largura
d f e
a
b
c
g
h
i j
k
Inserir no final, remover da frente: k
114
Busca em Largura Busca em Largura
d f e
a
b
c
g
h
i j
k
Ordem de visita partindo do vrtice a: a,b,c,d,e,f,g,h,i,j,k
115
Exerccio Exerccio
Fornea a ordem em que
so visitados os vrtices
do grafo ao lado usando
busca em largura (caso
um vrtice tenha mais de
um vrtice adjacente a
ele, visite primeiro os
vrtices de menor
nmero), assumindo a raiz
da busca como:
vrtice 1
vrtice 4
1
2
4 5
3
6 7
G
2
116
Soluo Soluo
Fornea a ordem em que
so visitados os vrtices
do grafo ao lado usando
busca em largura (caso
um vrtice tenha mais de
um vrtice adjacente a
ele, visite primeiro os
vrtices de menor
nmero), assumindo a raiz
da busca como:
vrtice 1
1,2,3,4,5,6,7
vrtice 4
4,2,1,5,3,6,7
1
2
4 5
3
6 7
G
2
1
2
4
5
3
6 7
G
2
20
117
Algoritmo de Busca em Largura Algoritmo de Busca em Largura
Para o algoritmo de busca em largura, uma fila
ser necessria
Para tanto, assume-se que os mtodos do ADT
fila encontram-se disponveis
Quando um vrtice adicionado na fila, usa-se a
operao Append (inserir no final)
Quando um vrtice retirado da fila, usa-se a
operao Serve (retirar do incio)
O mtodo Empty retorna true se a fila est vazia;
false caso contrrio
Como na busca em profundidade, as arestas de
retorno tambm podem ser visitadas estendendo
o algoritmo, o que deixado como exerccio
119
Algoritmo de Busca em Largura Algoritmo de Busca em Largura
// Uma pesquisa em largura de G=(V,E) com n vrtices iniciada a
partir do vrtice v. Todos os vrtices visitados so marcados
como sendo VISITED[i]. O arranjo VISITED[1..n] zerado
inicialmente
procedure BreadthFirstSearch(v)
VISITED[v] true; // marque v como visitado
definir uma fila Q vazia
Q.Append(v);
while not Q.Empty() do
Q.Serve(v); // retire v da fila Q
for para cada vrtice w adjacente a v do
if not VISITED[w] then
Q.Append(w); // adicione w fila Q
VISITED[w] true; // marque w como visitado
endif
next w
endwhile
end BreadthFirstSearch
121
Algoritmo de Busca em Largura Algoritmo de Busca em Largura
procedure BreadthFirstSearch(v)
VISITED[v] true; // marque v como visitado
definir uma fila Q vazia
Q.Append(v);
while not Q.Empty() do
Q.Serve(v); // retire v da fila Q
for para cada vrtice w adjacente a v do
if not VISITED[w] then
Q.Append(w); // adicione w fila Q
VISITED[w] true; // marque w como visitado
endif
next w
endwhile
end BreadthFirstSearch
// procedimento que chama BreadthFirstSearch
for i 1 to n do
VISITED[i] false;
next i
escolher vrtice raiz da busca, v;
BreadthFirstSearch(v);
123
Componentes Conexos Componentes Conexos
Sendo G um grafo no-orientado, pode-se determinar se
est ou no interligado, por simplesmente executando
DFS ou BFS para, em seguida, determinar se existe
algum vrtice no visitado
O tempo necessrio para se fazer isto de O(n
2
), se
forem utilizadas matrizes de adjacncias e O(e) se forem
utilizadas listas de adjacncias
Um problema mais interessante aquele em que se
determinam todos os componentes conexo de um grafo,
efetuando chamadas repetidas, a DFS(v) ou BFS(v),
sendo v um vrtice ainda no visitado
Isso nos leva ao algoritmo Comp, que determina todos os
componentes conexos de um grafo G
O algoritmo faz uso de DFS, sendo possvel substitu-lo
por BFS, sem afetar o tempo de computao
124
Componentes Conexos Componentes Conexos
// Determina os componentes conexos de G, que tem n 1
vrtices; VISITED agora um arranjo local.
procedure COMP()
// marcar todos os vrtices como no visitados
for i 1 to n do
VISITED[i] false;
next i
for i 1 to n do
if not VISITED[i] then
DepthFirstSearch(i); // procure um componente
d sada em todos os vrtices recm visitados,
junto com todas as arestas que incidem nos mesmos;
endif
next i
end COMP
125
Componentes Conexos Componentes Conexos
procedure COMP()
// marcar todos os vrtices como no visitados
for i 1 to n do
VISITED[i] false;
next i
for i 1 to n do
if not VISITED[i] then
DepthFirstSearch(i); // procure um componente
d sada em todos os vrtices recm visitados,
junto com todas as arestas que incidem nos mesmos;
endif
next i
end COMP
1
2 3
4
G
4
5
6 7
8
H
2
H
1
21
126
Componentes Conexos Componentes Conexos
Se G for representado por lista de adjacncias, o tempo
total consumido por DFS de O(e)
A sada pode ser completada em tempo O(e), contando que DFS
mantenha uma relao de todos os vrtices recm visitados
Uma vez que os laos for consomem O(n), o tempo total
necessrio para gerar todos os componentes conexos
O(n+e)
Em virtude da definio de um componente conexo,
existe um caminho entre cada par de vrtices no
componente e no existe caminho em G do vrtice v para
w, se v e w estiverem em dois componentes diferentes
Assim, se A matriz de adjacncias de um grafo no-
orientado (A simtrica), seu fechamento transitivo A
+
pode ser determinado em tempo O(n
2
) por se
determinarem primeiro os componentes conexos (que
ser visto mais adiante)
127
rvore de Cobertura rvore de Cobertura
Sendo um grafo G conexo, uma pesquisa em
profundidade ou em largura, comeando em qualquer
vrtice, visita todos os vrtices em G
Nesse caso, as arestas de G so divididas em dois
conjuntos
T, para arestas de rvore e
B, para arestas de retorno, ou frondes
sendo T o conjunto de arestas utilizadas ou atravessadas
durante a busca e B o conjunto de arestas remanescentes
O conjunto T pode ser determinado por se inserir o
comando seguinte nas clusulas then de DFS e BFS
T T {(v, w)}
As arestas em T formam uma rvore que inclui todos os
vrtices de G, ou seja, uma rvore de cobertura de G
128
rvore de Cobertura rvore de Cobertura
rvores de cobertura resultantes de busca em
profundidade e em largura de G, comeando pelo
vrtice 1
1
2
4 5
3
6 7
G
8
1
2
4 5
3
6 7
rvore de cobertura
DFS(1)
8
1
2
4 5
3
6 7
8
rvore de cobertura
BFS(1)
129
rvore de Cobertura rvore de Cobertura
Se os ns de G representarem, por exemplo, cidades e as
arestas representarem possveis meios de comunicao
entre duas cidades ento o nmero mnimo necessrio de
elos para interligar n cidades de (n-1) arestas
As rvores estendidas de G representaro todas as escolhas
possveis
Todavia, em situaes prticas so designadas s
arestas determinadas ponderaes
Essas ponderaes podem representar o custo da construo, o
comprimento de ligao etc
Tendo um grafo ponderado, seria ento desejvel
selecionar para fins de construo um conjunto de elos de
comunicaes que interligariam todas as cidades, tendo
custo total mnimo ou extenso total mnima
Em qualquer dos casos os elos selecionados tero que formar
uma rvore (admitindo que sejam positivas todas as ponderaes)
130
rvore de Cobertura rvore de Cobertura
Assim sendo, a seleo dos elos contm
ciclos
A remoo de qualquer um dos elos desse
ciclo resultar numa seleo de elos de
custo mais baixo, para interligar todas as
cidades
O objetivo encontrar uma rvore de
cobertura de G com custo mnimo
O custo de uma rvore de cobertura ser a
soma dos custos das arestas dessa rvore
131
rvore de Cobertura de Custo rvore de Cobertura de Custo
Mnimo Mnimo
Uma abordagem para determinao de uma
rvore estendida de custo mnimo de um grafo foi
proposta por Kruskal
Nessa abordagem construda, aresta por
aresta, uma rvore estendida de custo mnimo T
So consideradas as arestas para incluso em T,
por ordem crescente de seus custos
Uma aresta includa em T, caso no forme ciclo
com as arestas j existentes em T
Uma vez que G est interligado e possui n > 0
vrtices, sero selecionadas exatamente n-1
arestas para incluso em T
22
132
rvore de Cobertura de Custo rvore de Cobertura de Custo
Mnimo Mnimo
Quais as duas primeiras arestas a serem
includas em T, lembrando que as arestas so
selecionadas por ordem crescente de seus
custos?
4
6
2 1
5
3
16
19
21 11
14 33
18
6
5
10
G
4
6
2 1
5
3
Componentes conexos: {1}, {2}, {3}, {4}, {5}, {6}
133
rvore de Cobertura de Custo rvore de Cobertura de Custo
Mnimo Mnimo
As primeiras duas arestas (2,3) e (2,4)
esto includas em T
4
6
2 1
5
3
16
19
21 11
14 33
18
6
5
10
G
4
6
2 1
5
3
5
Componentes conexos: {1}, {2,3}, {4}, {5}, {6}
134
rvore de Cobertura de Custo rvore de Cobertura de Custo
Mnimo Mnimo
As primeiras duas arestas (2,3) e (2,4)
esto includas em T
4
6
2 1
5
3
16
19
21 11
14 33
18
6
5
10
G
4
6
2 1
5
3
6
5
Componentes conexos: {1}, {2,3,4}, {5}, {6}
135
rvore de Cobertura de Custo rvore de Cobertura de Custo
Mnimo Mnimo
A prxima aresta a ser considerada (4,3),
que liga entre si dois vrtices j interligados
em T e por isso rejeitada
4
6
2 1
5
3
16
19
21 11
14 33
18
6
5
10
G
4
6
2 1
5
3
6
5
10
Componentes conexos: {1}, {2,3,4}, {5}, {6}
136
rvore de Cobertura de Custo rvore de Cobertura de Custo
Mnimo Mnimo
A aresta (2,6) selecionada...
4
6
2 1
5
3
16
19
21 11
14 33
18
6
5
10
G
4
6
2 1
5
3
11
6
5
Componentes conexos: {1}, {2,3,4,6}, {5}
137
rvore de Cobertura de Custo rvore de Cobertura de Custo
Mnimo Mnimo
A aresta (2,6) selecionada, ao passo que (4,6)
rejeitada, uma vez que os vrtices 4 e 6 j
esto ligados em T, sendo que a incluso de
(4,6) resultaria num ciclo
4
6
2 1
5
3
16
19
21 11
14 33
18
6
5
10
G
4
6
2 1
5
3
11
14
6
5
Componentes conexos: {1}, {2,3,4,6}, {5}
23
138
rvore de Cobertura de Custo rvore de Cobertura de Custo
Mnimo Mnimo
Finalmente, so includas as arestas (1,2)...
4
6
2 1
5
3
16
19
21 11
14 33
18
6
5
10
G
4
6
2 1
5
3
16
11
6
5
Componentes conexos: {1,2,3,4,6}, {5}
139
rvore de Cobertura de Custo rvore de Cobertura de Custo
Mnimo Mnimo
Finalmente, so includas as arestas (1,2) e
(4,5)
4
6
2 1
5
3
16
19
21 11
14 33
18
6
5
10
G
4
6
2 1
5
3
16
11
18
6
5
Componentes conexos: {1,2,3,4,5,6}
140
rvore de Cobertura de Custo rvore de Cobertura de Custo
Mnimo Mnimo
Nesse ponto, T possui n-1 arestas, sendo uma
rvore que abrange n vrtices
A rvore de cobertura obtida tem custo de 56
4
6
2 1
5
3
16
19
21 11
14 33
18
6
5
10
G
4
6
2 1
5
3
16
11
18
6
5
rvore de cobertura de custo mnimo de G
141
rvore de Cobertura de Custo rvore de Cobertura de Custo
Mnimo Mnimo
A seqncia de arestas consideradas para serem
includas na rvore de cobertura de custo mnimo foi:
(2,3), (2,4), (4,3), (2,6), (4,6), (1,2) e (4,5)
Isto corresponde seqncia de custos 5, 6, 10, 11, 14, 16 e 18
4
6
2 1
5
3
16
19
21 11
14 33
18
6
5
10
G
4
6
2 1
5
3
16
11
18
6
5
rvore de cobertura de custo mnimo de G
142
Exerccio Exerccio
Encontre a rvore de cobertura de custo
mnimo do grafo G e o custo
correspondente
4
6
2 1
5
3
14
5
11 21
33 18
19
7
3
6
G
4
6
2 1
5
3
143
Soluo Soluo
T = {(2,3), (1,5), (3,4), (1,6), (1,2)}
Custo(T) = 39
4
6
2 1
5
3
14
5
11 21
33 18
19
7
3
6
G rvore de cobertura de custo mnimo de G
4
6
2 1
5
3
14
5
11
3
6
24
144
Algoritmo de Algoritmo de Kruskal Kruskal
function Kruskal
1 T ;
2 while T contm menos de n-1 arestas and E no vazio do
3 escolha uma aresta (v,w) de E, de menor custo;
4 E E {(v,w)}; // remova (v,w) de E
5 if (v,w) no cria um ciclo em T then
6 T T {(v, w)}; // adicione (v,w) a T
7 endif
8 endwhile
9 if T contm menos de n-1 arestas then
10 T ; // nenhuma rvore de cobertura encontrada
11 endif
12 return T;
end Kruskal
145
Algoritmo de Algoritmo de Kruskal Kruskal
Inicialmente, E o conjunto de todas as arestas em G
As nicas funes realizadas com este conjunto so:
(i) determinar uma aresta com custo mnimo (linha 3) e
(ii) remover essa aresta (linha 4)
Ambas funes podem ser realizadas com eficincia, contanto que as
arestas em E sejam mantidas como lista seqencial ordenada por
custos
Na realidade, no essencial classificar todas as arestas, contanto
que a prxima aresta para a linha 3 possa ser determinada com
facilidade
A ordenao pelo mtodo heapsort serve de maneira ideal para isto e
permite que a prxima aresta seja determinada e seja removida em
tempo O(e*log(e))
A construo do heap em si requer tempo O(e)
O tempo de computao do algoritmo determinado pelas linhas 3 e
4 que, no pior caso, de O(e*log(e))
146
Algoritmo de Algoritmo de Kruskal Kruskal
Para se realizar eficientemente os passos 5 e 6, os
vrtices em G devem ser agrupados de tal maneira que
se possa facilmente determinar se os vrtices v e w j
esto interligados pela seleo anterior de arestas
Nesse caso, a aresta (v,w) deve ser descartada
Caso contrrio, (v,w) deve ser includa em T
Um agrupamento possvel consistiria em se colocarem
todos os vrtices do mesmo componente conexo de T
num conjunto (todos os componentes conexos de T sero
tambm rvores)
Assim, dois vrtices v e w, estaro interligados em T se
estiverem no mesmo conjunto
147
Algoritmo de Algoritmo de Kruskal Kruskal
No exemplo, onde se considera a aresta (4,3), os
conjuntos seriam {1}, {2,3,4}, {5}, {6}
Os vrtices 4 e 3 j esto no mesmo conjunto, de
forma que a aresta (4,3) rejeitada
4
6
2 1
5
3
16
19
21 11
14 33
18
6
5
10
G
4
6
2 1
5
3
6
5
10
148
Algoritmo de Algoritmo de Kruskal Kruskal
A prxima aresta a ser considerada (2,6), os conjuntos ainda so
{1}, {2,3,4}, {5}, {6}
Como os vrtices 2 e 6 esto em conjuntos diferentes, a aresta aceita
interligando os dois componentes {2,3,4} e {6}
Esses dois componentes devem ser unidos para se obter o conjunto que
representa o novo componente {2,3,4,6}
4
6
2 1
5
3
16
19
21 11
14 33
18
6
5
10
G
4
6
2 1
5
3
11
6
5
149
Caminhos Mais Curtos Caminhos Mais Curtos
Os grafos podem ser utilizados para representar a
estrutura rodoviria de um estado ou de um pas, com os
vrtices representando cidades e as arestas
representando trechos de rodovia
As arestas podem ento ter ponderaes podem ser a
distncia entre as duas cidades interligadas pela aresta,
ou o tempo mdio necessrio para percorrer a referida
seo da rodovia ou mesmo o custo de combustvel
Um motorista que queira ir da cidade A para a cidade B
estaria interessado em ter as respostas para:
Existe um caminho que vai de A para B?
Havendo mais de um caminho de A para B, qual o caminho mais
curto?
25
150
Caminhos Mais Curtos Caminhos Mais Curtos
Os grafos podem ser utilizados para representar a
estrutura rodoviria de um estado ou de um pas, com os
vrtices representando cidades e as arestas
representando trechos de rodovia
As arestas podem ento ter ponderaes podem ser a
distncia entre as duas cidades interligadas pela aresta,
ou o tempo mdio necessrio para percorrer a referida
seo da rodovia ou mesmo o custo de combustvel
Um motorista que queira ir da cidade A para a cidade B
estaria interessado em ter as respostas para:
Existe um caminho que vai de A para B?
Havendo mais de um caminho de A para B, qual o caminho mais
curto?
151
Caminhos Mais Curtos Caminhos Mais Curtos
O comprimento de um caminho agora
definido como a soma das ponderaes das
arestas do caminho ao invs do nmero de
arestas
O vrtice inicial do caminho ser denominado
origem e o ltimo vrtice destino
Os grafos possivelmente sero dgrafos para
levar em conta as ruas de mo nica
A no ser que se indique ao contrrio,
admitiremos que todas as ponderaes so
positivas
152
Origem nica de Todos os Destinos Origem nica de Todos os Destinos
Sejam
G(V,E) um grafo dirigido
w(e) uma funo de ponderao para as
arestas de G
v
o
o vrtice de origem
O problema consiste em se determinar
quais os caminhos mais curtos de v
o
para
todos os demais vrtices de G
Admite-se que todas as ponderaes
sejam positivas
153
Origem nica de Todos os Destinos Origem nica de Todos os Destinos
No exemplo, os nmeros aplicados s arestas
so as ponderaes
Sendo v
o
=0 o vrtice de origem, o caminho mais
curto de 0 para 1 0,2,3,1
O comprimento desse caminho 10+15+20 = 45
0 1 4
2 3 5
50
15
15 3
20 10 20
10
35
30
45
154
Origem nica de Todos os Destinos Origem nica de Todos os Destinos
No exemplo, os nmeros aplicados s arestas so as ponderaes
Sendo v
o
=0 o vrtice de origem, o caminho mais curto de 0 para 1
0,2,3,1
O comprimento desse caminho 10+15+20 = 45
Ainda que esse caminho apresente trs arestas, ele mais curto do
que o caminho 0,1 cujo comprimento 50
No existe caminho de 0 para 5
45 0,4
45 0,2,3,1
25 0,2,3
10 0,2
Comprimento Caminho
0 1 4
2 3 5
50
15
15 3
20 10 20
10
35
30
45
Caminhos mais curtos de v
o
para todos os destinos
155
Origem nica de Todos os Destinos Origem nica de Todos os Destinos
Os caminhos foram relacionados por ordem
crescente de comprimento
Se elaborarmos um algoritmo que gere os
caminhos mais curtos, nessa ordem, podemos
ento chegar a diversas observaes
Seja S o conjunto de vrtices (inclusive v
o
) para
as quais j foram encontrados os caminhos mais
curtos
Para o caso de w S, seja DIST[w] o
comprimento do caminho mais curto, partindo de
v
o
e passando unicamente por aqueles vrtices
que esto em S e que terminem em w
26
156
Origem nica de Todos os Destinos Origem nica de Todos os Destinos
Observamos que
(i) Se o prximo caminho mais curto for aquele que vai para o vrtice u, o
caminho comea em v
o
, termina em u e passa unicamente atravs
daqueles vrtices de S
Para comprovar isto temos que mostrar que todos os vrtices intermedirios
no caminho mais curto para u esto em S
Admitamos que exista um vrtice w nesse caminho que no se encontre em S
Nesse caso, o caminho de v
o
para u contm tambm um caminho de v
o
para
w que de comprimento inferior ao caminho de v
o
para u
Supondo que os caminhos mais curtos esto sendo gerados em ordem
crescente de comprimento, o caminho mais curto v
o
para w j deve ter sido
gerado
Assim sendo, no pode haver vrtice intermedirio que no esteja em S
(ii) O destino do prximo caminho gerado deve ser aquele vrtice u que
tem a distncia mnima, DIST[u] entre todos os vrtices que no esto
em S
Isto decorre da definio de DIST e da observao (i)
Caso existam diversos vrtices que no estejam em S, mas que tenham a
mesma DIST, qualquer um deles poder ser selecionado
158
Origem nica de Todos os Destinos Origem nica de Todos os Destinos
(iii) Tendo selecionado um vrtice u, como em (ii) e tendo gerado o caminho
mais curto de v
o
para u, o vrtice u passa a se tornar integrante de S
Nesse ponto, poder diminuir o comprimento dos caminhos mais curtos
comeando em v
o
e que passam atravs dos vrtices em S, que terminam em um
vrtice w que no est em S
Em outras palavras, o valor de DIST[w] poder sofrer alterao
Caso no mude, isto ser devido a um caminho mais curto que comea em v
o
e
que vai a u e depois a w
Os vrtices intermedirios no caminho v
o
para u e no caminho de u para w devem
todos estar em S
Alm do mais, o caminho de v
o
para u deve ser o caminho mais curto (caso
contrrio, DIST[w] no foi definida corretamente)
O caminho de u para w pode ser escolhido para no conter quaisquer vrtices
intermedirios
Podemos, portanto, concluir que se DIST[w] vai mudar (isto , diminuir), em
virtude de um caminho de v
o
para u para w, onde o caminho de v
o
para u o
caminho mais curto, sendo que o caminho de u para w a aresta (u,w)
O comprimento desse caminho ser DIST[u] + custo da aresta (u,w)
159
Origem nica de Todos os Destinos Origem nica de Todos os Destinos
O algoritmo para encontrar o caminho mais curto foi enunciado pela
primeira vez por Dijkstra e recorre s observaes precedentes a fim
de determinar o custo dos caminhos mais curtos de v
o
para todos os
demais vrtices em G
Admite-se que os n vrtices de G so numerados de 1 at n
O conjunto S mantido como um arranjo de bits com S[i]=false se o
vrtice i no esteja em S e sendo S[i]=true caso contrrio
Admite-se ainda que o grafo est representado pela sua matriz de
adjacncias de custos, sendo COST[i,j] a ponderao da aresta (i,j)
COST[i,j] conter algum nmero grande +, caso a aresta (i,j) no
esteja em E(G)
Para i=j, COST[i,j] pode ser qualquer nmero no-negativo sem
afetar o resultado do algoritmo
A gerao real dos caminhos uma extenso de menor importncia
do prprio algoritmo, sendo deixada como exerccio
160
Algoritmo de Algoritmo de Dijkstra Dijkstra
Inicialmente:
v
o
= 5 (origem)
S vazio
DIST[i] consiste em COST[v
o
,i]
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
+
+
25
0
150
+
+
+
S = {}
161
Algoritmo de Algoritmo de Dijkstra Dijkstra
Inicialmente:
v
o
= 5 (origem)
S
DIST[i] consiste em COST[v
o
,i]
Coloque v
o
em S
S S {v
o
}
DIST[v
o
] 0
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
+
+
25
0
150
+
+
+
S = {5}
162
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 6
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
+
+
25
0
150
+
+
+
S = {5}
27
163
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 6
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
+
+
25
0
150
+
+
+
S = {5,6}
164
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 6
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
DIST[4] mn{DIST[4], DIST[6]+COST[6,4]}
DIST[4] mn{150, 25+100}
DIST[4] 125
Analogamente para demais w S
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
+
+
25
0
150
+
+
+
S = {5,6}
165
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 6
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
+
+
+
S = {5,6}
166
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 7
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
+
+
+
S = {5,6}
167
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 7
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
+
+
+
S = {5,6,7}
168
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 7
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
+
+
+
S = {5,6,7}
28
169
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 4
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
+
+
+
S = {5,6,7}
170
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 4
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
+
+
+
S = {5,6,7,4}
171
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 4
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
245
+
+
S = {5,6,7,4}
172
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 8
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
245
+
+
S = {5,6,7,4}
173
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 8
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
245
+
+
S = {5,6,7,4,8}
174
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 8
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
245
+
335
S = {5,6,7,4,8}
29
175
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 3
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
245
+
335
S = {5,6,7,4,8}
176
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 3
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
245
+
335
S = {5,6,7,4,8,3}
177
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 3
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
245
325
335
S = {5,6,7,4,8,3}
178
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 2
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
245
325
335
S = {5,6,7,4,8,3}
179
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 2
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
245
325
335
S = {5,6,7,4,8,3,2}
180
Algoritmo de Algoritmo de Dijkstra Dijkstra
Escolha u tal que
DIST[u] = mn{DIST[w]} para todos w S
u = 2
Coloque u em S
S S {u}
Para todos w S
DIST[w] mn{DIST[w], DIST[u]+COST[u,w]}
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
0
25
6
140 90 100 6
120
0
3
150
0
4
0
5
80 100 3
4
5
100 0 7
0
8
170 8
0 30 2
0 1
7 2 1
8
7
6
5
4
3
2
1
DIST
165
115
25
0
125
245
325
335
S = {5,6,7,4,8,3,2}
30
181
Algoritmo de Algoritmo de Dijkstra Dijkstra
DIST Vrtice
165 115 25 0 125 245 325 335 5,6,7,4,8,3,2 final
165 115 25 0 125 245 325 335 2 5,6,7,4,8,3 6
165 115 25 0 125 245 325 335 3 5,6,7,4,8 5
165 115 25 0 125 245 + 335 8 5,6,7,4 4
165 115 25 0 125 245 + + 4 5,6,7 3
165 115 25 0 125 + + + 7 5,6 2
165 115 25 0 125 + + + 6 5 1
+ + 25 0 150 + + + 5 inicial
8 7 6 5 4 3 2 1 Selecionado
S Iterao
1
2 3 4 5
6
7 8
80
30 100
170
120 150
25
140
90
100
100
182
Algoritmo de Algoritmo de Dijkstra Dijkstra
// DIST[j], 1 j n posicionado para o comprimento do caminho
mais curto do vrtice v at o vrtice j num dgrafo G com n
vrtices. G representado por sua matriz de adjacncias de
custos COST[1..n, 1..n]. S um arranjo declarado como S[1..n]
procedure ShortestPath(v, COST, DIST, n)
1 for i 1 to n do // inicialize conjunto S como vazio
2 S[i] false; DIST[i] COST[v,i];
3 next j
4 S[v] true; DIST[v] 0; num 2 // coloque v no conjunto S
5 while num < n do // determine n-1 caminhos a partir de v
6 escolha u: DIST[u] = mn{DIST[w]} para todos w com S[w]=false
7 S[u] true; num num + 1; // coloque u no conjunto S
8 for todos w com S[w]=false do // atualize as distncias
9 DIST[w] mn{DIST[w], DIST[u]+COST[u,w]};
10 next w
11 endwhile
end ShortestPath
184
Exerccio Exerccio
Utilize o algoritmo ShortestPath para obter, em
seqncia crescente, os comprimentos dos
caminhos mais curtos entre o vrtice 1 e todos os
vrtices restantes do dgrafo
3
4
2 5
6
1
10
10
15
30
4
10
4
2
15
20
185
Exerccio Exerccio
Utilize o algoritmo ShortestPath para obter, em
seqncia crescente, os comprimentos dos
caminhos mais curtos entre o vrtice 1 e todos os
vrtices restantes do dgrafo
3
4
2 5
6
1
10
10
15
30
4
10
4
2
15
20
0
15
3
4
15
0
4
10
0
10
5
10 4 3
4
5
0
30
6
6
0 2 2
20 0 1
2 1
186
Soluo Soluo
3
4
2 5
6
1
10
10
15
30
4
10
4
2
15
20
DIST Vrtice
25 29 29 15 19 0 1,3,2,6,4 final
25 29 29 15 19 0 4 1,3,2,6 4
25 29 29 15 19 0 6 1,3,2 3
25 29 + 15 19 0 2 1,3 2
25 + + 15 19 0 3 1 1
+ + + 15 20 0 1 inicial
6 5 4 3 2 1 Selecionado
S Iterao
0
15
3
4
15
0
4
10
0
10
5
10 4 3
4
5
0
30
6
6
0 2 2
20 0 1
2 1
187
Anlise de Anlise de ShortestPath ShortestPath
O tempo consumido pelo algoritmo em um
grafo com n vrtices :
O lao for da linha 1 leva um tempo de O(n)
O lao while executado n-2 vezes
Cada execuo deste lao requer um tempo de
O(n) na linha 6, para selecionar o prximo vrtice e
novamente, nas linhas 8-10 para atualizar DIST
Assim, o tempo total de execuo de
O(n
2
)
31
188
Anlise de Anlise de ShortestPath ShortestPath
Qualquer algoritmo de caminho mais curto deve examinar cada
aresta no grafo uma vez pelo menos, j que qualquer uma das
arestas poderia estar num caminho mais curto
Assim sendo, o tempo mnimo possvel seria O(e)
Uma vez que foi utilizada matriz de adjacncias de custos para
representar o grafo, isso toma o tempo de O(n
2
) s para determinar
quais as arestas que esto em G
Assim qualquer algoritmo de caminho mais curto que utilizar essa
representao deve tomar O(n
2
)
Dessa forma, o algoritmo ShortestPath encontra-se otimizado, dentro de
um fator constante
No caso de listas de adjacncias, o tempo total para o lao for das
linhas 8-10 pode ser reduzido para O(e)
Uma vez que DlST pode mudar somente no caso dos vrtices adjacentes
a u
O tempo total para a linha 6 continua a ser O(n
2
)
189
Caminhos Mais Curtos entre Todos Caminhos Mais Curtos entre Todos
os Pares os Pares
O problema do caminho mais curto entre todos os pares
requer encontrar os caminhos mais curtos entre todos os
pares de vrtices v
i
e v
j
, ij
Uma possvel soluo seria aplicar n vezes o algoritmo
ShortestPath, uma vez para cada vrtice em V(G) como
origem
O tempo total consumido seria O(n
3
)
Para o problema de todos os pares, podemos obter um
algoritmo mais simples em termos conceituais e que
funcionar ainda que algumas arestas em G tenham
ponderaes negativas. contanto que G no tenha ciclos
com comprimento negativo
O tempo de computao desse algoritmo ainda ser O(n
3
),
embora seja menor o fator constante
190
Caminhos Mais Curtos entre Todos Caminhos Mais Curtos entre Todos
os Pares os Pares
O grafo G representado pela sua matriz de
adjacncias de custos, com
COST[i,i] = 0 e
COST[i,j] = + caso a aresta (i,j), ij no esteja em G
Seja A
k
[i,j] defindo como o custo do caminho
mais curto de i at j que no passa por nenhum
vrtice intermedirio com ndice superior a k
Nesse caso A
n
[i,j] ser o custo do caminho mais
curto de i para j em G, que possui n vrtices
A
0
[i,j] igual a COST[i,j] uma vez que os nicos
caminhos de i at j permitidos no podem incluir
vrtices intermedirios
191
Caminhos Mais Curtos entre Todos Caminhos Mais Curtos entre Todos
os Pares os Pares
A idia bsica no algoritmo de todos os pares gerar
sucessivamente as matrizes A
0
, A
1
, A
2
, ..., A
n
Se j tivermos gerado A
k-1
, podemos gerar A
k
, por
compreender que para qualquer par de vrtices i e j
ou (a) o caminho mais curto de i para j (que no atravessa
nenhum vrtice com ndice superior a k) no passa pelo vrtice k;
assim, seu custo ser A
k-1
[i,j]
ou (b) o mais curto desses caminhos passa pelo vrtice k: esse
caminho composto por uma rota de i at k e outro rota de k at
j; esses caminhos devem ser os caminhos mais curtos de i para k
e de k para j que no atravessam nenhum vrtice com ndice
superior a k-1; assim, seus custos so A
k-1
[i,k] e A
k-1
[k,j]
Isto verdade se G no tiver nenhum ciclo com o
comprimento negativo contendo o vrtice k
192
Caminhos Mais Curtos entre Todos Caminhos Mais Curtos entre Todos
os Pares os Pares
Assim, obtemos as seguintes frmulas para
A
k
[i,j]
A
0
[i,j] = COST[i,j]
A
k
[i,j] = mn{A
k-1
[i,j], A
k-1
[i,k]+A
k-1
[k,j]}, k1
O algoritmo AllCosts calcula A
n
[i,j]
O clculo efetuado na prpria matriz,
sendo eliminado o superscrito de A
O clculo pode ser feito na prpria matriz uma
vez que A
k
[i,k]=A
k-1
[i,k] e A
k
[k,j]=A
k-1
[k,j] de
modo que a computao no altera o resultado
193
1
2 3
4
2
11
6 3
0 + 3 3
2 0 6 2
11 4 0 1
3 2 1 COST
0 + 3 3
2 0 6 2
11 4 0 1
3 2 1 A
0
0 7 3 3
2 0 6 2
11 4 0 1
3 2 1 A
1
0 7 3 3
2 0 6 2
6 4 0 1
3 2 1 A
2
0 7 3 3
2 0 5 2
6 4 0 1
3 2 1 A
3
Exemplo Exemplo
32
194
Algoritmo Algoritmo AllCosts AllCosts
// COST[1..n,1..n] a matriz de adjacncias de custos de um grafo
com n vrtices; A[i,j] o custo do caminho mais curto entre
vrtices i e j. COST[i,i]= 0, 1 i n
procedure AllCosts(n,COST,A)
1 for i 1 to n do
2 for j 1 to n do
3 A[i,j] COST[i,j];
4 next j
5 next i
6 for k 1 to n do
7 for i 1 to n do
8 for j 1 to n do
9 A[i,j] mn{A[i,j], A[i,k]+A[k,j]};
10 next j
11 next i
12 next k
end AllCosts
195
Fechamento Transitivo Fechamento Transitivo
Um problema relacionado com o problema do caminho
mais curto de todos os pares o de se determinar para
cada par de vrtices i e j em G, a existncia de um
caminho de i at j
O comprimento do caminho igual ao nmero de arestas
Sendo A a matriz de adjacncias de G, ento a matriz A
+
que tiver a propriedade
A
+
[i,j] = 1, se h um caminho de comprimento > 0 de i para j
A
+
[i,j] = 0, caso contrrio
A
+
denominada matriz de fechamento transitivo de G
A matriz A
*
com a propriedade
A
*
[i,j] = 1, se h um caminho de comprimento 0 de i para j
A
*
[i,j] = 0, caso contrrio
A
*
denominada matriz de fechamento transitivo
reflexivo de G
196
Exemplo Exemplo
1 2 3
4 5
0 0 1 0 0 5
1 0 0 0 0 4
0 1 0 0 0 3
0 0 1 0 0 2
0 0 0 1 0 1
5 4 3 2 1 A
1 1 1 0 0 5
1 1 1 0 0 4
1 1 1 0 0 3
1 1 1 0 0 2
1 1 1 1 0 1
5 4 3 2 1 A
+
1 1 1 0 0 5
1 1 1 0 0 4
1 1 1 0 0 3
1 1 1 1 0 2
1 1 1 1 1 1
5 4 3 2 1 A
*
197
Fechamento Transitivo Fechamento Transitivo
A nica diferena entre A
*
e A
+
reside nos termos da
diagonal
A
+
[i,j] = 1 se existe um ciclo de comprimento > 1 contendo
o vrtice i, enquanto A*[i,i] ser sempre igual a 1, uma
vez que existe um caminho de comprimento 0 que vai de i
para i
Se usarmos o algoritmo AllCosts com
COST[i,j]=1, se (i,j) for uma aresta em G e
COST[i,j]=+ se (i,j) no est em G
ento podemos obter facilmente A
+
da matriz final A
deixando A
+
[i,j]=1 se A[i,j] < +
A* pode ser obtido de A
+
, fazendo-se iguais a 1 todos os
elementos da diagonal
O tempo total de O(n
3
)
198
Ordenao Topolgica Ordenao Topolgica
Todos os projetos, exceto os mais simples, podem ser subdivididos em
diversos subprojetos denominados tarefas ou atividades
A terminao bem-sucedida dessas atividades resultar na concluso do
projeto na sua totalidade
Em projetos de engenharia ou manufatura, uma tarefa dividida em subtarefas.
Em geral, o trmino de certas subtarefas deve preceder a execuo de outras
subtarefas. Se uma subtarefa x deve preceder uma subtarefa y, isto ser denotado
por x < y. A ordenao topolgica, neste caso, consiste em dispor as subtarefas
em uma ordem tal que, antes da iniciao de cada subtarefa, todas as subtarefas
de que ela depende tenham sido previamente completadas
Em um currculo universitrio, algumas disciplinas devem ser cursadas antes de
outras, uma vez que se baseiam nos tpicos apresentados nas disciplinas que so
seus pr-requisitos. Se uma disciplina x pr-requisito da disciplina y, a notao
ser x < y. A ordenao topolgica corresponde, no caso, a arranjar as disciplinas
em uma ordem tal que nenhuma delas exija como pr-requisito uma outra que no
tenha sido previamente cursada
Em um programa, alguns procedimentos podem conter referncias (chamadas) a
outros procedimentos. Se um procedimento x chamado por um procedimento y,
denota-se o fato por x < y. Neste caso, a ordenao topolgica implica o arranjo
das declaraes de procedimento em tal forma que nunca haja referncias a
procedimentos a serem declarados posteriormente
199
Ordenao Topolgica Ordenao Topolgica
Uma ordem parcial de um conjunto S uma relao entre
os elementos de S
Esta relao, denotada pelo smbolo <, verbalmente lida
como precede:
x < y lido como x precede y
Uma ordem parcial deve satisfazer as trs seguintes
propriedades (axiomas), para quaisquer elementos
distintos x, y, z de S:
(a) se x < y e y < z, ento x < z (transitividade)
(b) se x < y, ento no ocorre y < x (assimetria)
(c) no ocorre z < z (irreflexiva)
Admite-se, por motivos bvios, que o conjunto S finito
Uma ordem parcial pode ser representada por um grafo
no qual os vrtices denotam os elementos de S e as
arestas representam as relaes de ordem
33
200
Ordenao Topolgica Ordenao Topolgica
Admita que o conjunto S e suas
relaes de ordenao sejam
inicialmente representados por
uma seqncia de pares de ns
Para o exemplo ao lado, as
relaes de ordem entre os
vrtices so mostrados a
seguir, no qual os smbolos <
esto explicitados para maior
clareza:
1 < 2 2 < 4
4 < 6 2 < 10
4 < 8 6 < 3
1 < 3 3 < 5
5 < 8 7 < 5
7 < 9 9 < 4
9 < 10
1 2
3
4
5
6
7
8
9
10
201
Ordenao Topolgica Ordenao Topolgica
O problema da ordenao topolgica consiste
em encontrar, em uma ordem linear, uma ordem
parcial
Graficamente, isto implica o arranjo linear dos
vrtices do grafo, de tal maneira que todas as
arestas tenham o mesmo sentido (para a direita,
por exemplo)
As propriedades (a) e (b) da ordem parcial
garantem a ausncia de ciclos no grafo, o que
permite encontrar uma ordem parcial em uma
ordem linear
202
Ordenao Topolgica Ordenao Topolgica
Por exemplo, dado o grafo
Uma ordenao topolgica resultante seria
1 2
3
4
5
6
7
8
9
10
7 9 1 2 4 6 3 5 8 10
203
Ordenao Topolgica Ordenao Topolgica
O algoritmo para encontrar uma das possveis
ordenaes lineares bastante simples:
Escolhem-se inicialmente os ns que no sejam
precedidos por quaisquer outros ( necessrio que
haja no mnimo um elemento nessas condies;
caso contrrio existiria um ciclo e o conjunto no
seria parcialmente ordenado), denotando esse
conjunto de ns sem predecessores por P
escolhe-se ento um n x de P, colocando x no
incio da lista de sada L; em seguida o n x
eliminado do conjunto S
O conjunto S resultante ainda se encontra
parcialmente ordenado, devendo ento o mesmo
algoritmo ser aplicado sucessivamente at que o
conjunto S se esgote
204
Ordenao Topolgica Ordenao Topolgica
Para efeitos de implementao, admite-se no algoritmo que o grafo
seja representado por listas de adjacncias
Os vrtices de cabealho dessas relaes contm dois campos:
count (contador): O campo count contm o grau de entrada do vrtice
correspondente
link um ponteiro para o primeiro vrtice da lista de adjacncias do vrtice
Cada vrtice ser representado por uma lista com 2 campos:
vertex, que mantm o nmero do vrtice correspondente
NextNode, um ponteiro para o prximo vrtice
Os campos count podem ser estabelecidos facilmente por ocasio da
entrada
Ao se dar entrada na aresta (i,j), a contagem do vrtice j incrementada
por 1
A lista de vrtices com contagem zero mantida sob forma de uma
pilha
Poderia ter sido utilizada uma fila, mas a pilha um pouco mais simples
A pilha ligada por meio do campo count dos vrtices da cabealho,
uma vez que esse campo no de utilidade, depois que o count
ficou igual a zero
205
Exemplo Exemplo
1 2
3
4
5
6
7
8
9
10
2 10
1 9
2 8
0 7
1 6
2 5
2 4
2 3
1 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
vertex
NextNode
34
206
Exemplo Exemplo
1 2
3
4
5
6
7
8
9
10
2 10
1 9
2 8
1 7
1 6
2 5
2 4
2 3
1 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=7
4 10
Retire elemento do topo da
pilha, x
x = 7
Coloque x na lista L
L = []
Decremente os contadores
dos sucessores x
Se algum sucessor ficar com
count=0, inclua-o na pilha
207
Exemplo Exemplo
1 2
3
4
5
6
7
8
9
10
2 10
1 9
2 8
1 7
1 6
2 5
2 4
2 3
1 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=1
4 10
Retire elemento do topo da
pilha, x
x = 7
Coloque x na lista L
L = [7]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar com
count=0, inclua-o na pilha
208
Exemplo Exemplo
2 10
0 9
2 8
1 7
1 6
1 5
2 4
2 3
1 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=1
4 10
Retire elemento do topo da
pilha, x
x = 7
Coloque x na lista L
L = [7]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar com
count=0, inclua-o na pilha
1 2
3
4
5
6
7
8
9
10
209
Exemplo Exemplo
2 10
1 9
2 8
1 7
1 6
1 5
2 4
2 3
1 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10 top=9
4 10
Retire elemento do topo da
pilha, x
x = 7
Coloque x na lista L
L = [7]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
210
Exemplo Exemplo
2 10
1 9
2 8
1 7
1 6
1 5
2 4
2 3
1 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10 top=9
4 10
Retire elemento do topo da
pilha, x
x = 9
Coloque x na lista L
L = [7]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
211
Exemplo Exemplo
2 10
1 9
2 8
1 7
1 6
1 5
2 4
2 3
1 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=1
4 10
Retire elemento do topo da
pilha, x
x = 9
Coloque x na lista L
L = [7,9]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
35
212
Exemplo Exemplo
1 10
1 9
2 8
1 7
1 6
1 5
1 4
2 3
1 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=1
4 10
Retire elemento do topo da
pilha, x
x = 9
Coloque x na lista L
L = [7,9]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
213
Exemplo Exemplo
1 10
1 9
2 8
1 7
1 6
1 5
1 4
2 3
1 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=1
4 10
Retire elemento do topo da
pilha, x
x = 1
Coloque x na lista L
L = [7,9]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
214
Exemplo Exemplo
1 10
1 9
2 8
1 7
1 6
1 5
1 4
2 3
1 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 1
Coloque x na lista L
L = [7,9,1]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
215
Exemplo Exemplo
1 10
1 9
2 8
1 7
1 6
1 5
1 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 1
Coloque x na lista L
L = [7,9,1]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
216
Exemplo Exemplo
1 10
1 9
2 8
1 7
1 6
1 5
1 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=2 4 10
Retire elemento do topo da
pilha, x
x = 1
Coloque x na lista L
L = [7,9,1]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o
na pilha
1 2
3
4
5
6
7
8
9
10
217
Exemplo Exemplo
1 10
1 9
2 8
1 7
1 6
1 5
1 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=2 4 10
Retire elemento do topo da
pilha, x
x = 2
Coloque x na lista L
L = [7,9,1]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
36
218
Exemplo Exemplo
1 10
1 9
2 8
1 7
1 6
1 5
1 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 2
Coloque x na lista L
L = [7,9,1,2]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
219
Exemplo Exemplo
0 10
1 9
2 8
1 7
1 6
1 5
0 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 2
Coloque x na lista L
L = [7,9,1,2]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
220
Exemplo Exemplo
4 10
1 9
2 8
1 7
1 6
1 5
0 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=10
4 10
Retire elemento do topo da
pilha, x
x = 2
Coloque x na lista L
L = [7,9,1,2]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o
na pilha
1 2
3
4
5
6
7
8
9
10
221
Exemplo Exemplo
4 10
1 9
2 8
1 7
1 6
1 5
0 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=10
4 10
Retire elemento do topo da
pilha, x
x = 10
Coloque x na lista L
L = [7,9,1,2]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
222
Exemplo Exemplo
4 10
1 9
2 8
1 7
1 6
1 5
0 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=4
4 10
Retire elemento do topo da
pilha, x
x = 10
Coloque x na lista L
L = [7,9,1,2,10]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
223
Exemplo Exemplo
4 10
1 9
2 8
1 7
1 6
1 5
0 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=4
4 10
Retire elemento do topo da
pilha, x
x = 10
Coloque x na lista L
L = [7,9,1,2,10]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
37
224
Exemplo Exemplo
4 10
1 9
2 8
1 7
1 6
1 5
0 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=4
4 10
Retire elemento do topo da
pilha, x
x = 4
Coloque x na lista L
L = [7,9,1,2,10]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
225
Exemplo Exemplo
4 10
1 9
2 8
1 7
1 6
1 5
0 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 4
Coloque x na lista L
L = [7,9,1,2,10,4]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
226
Exemplo Exemplo
4 10
1 9
1 8
1 7
0 6
1 5
0 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 4
Coloque x na lista L
L = [7,9,1,2,10,4]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
227
Exemplo Exemplo
4 10
1 9
1 8
1 7
0 6
1 5
0 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=6
4 10
Retire elemento do topo da
pilha, x
x = 4
Coloque x na lista L
L = [7,9,1,2,10,4]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o
na pilha
1 2
3
4
5
6
7
8
9
10
228
Exemplo Exemplo
4 10
1 9
1 8
1 7
0 6
1 5
0 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=6
4 10
Retire elemento do topo da
pilha, x
x = 6
Coloque x na lista L
L = [7,9,1,2,10,4]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
229
Exemplo Exemplo
4 10
1 9
1 8
1 7
0 6
1 5
0 4
1 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 6
Coloque x na lista L
L = [7,9,1,2,10,4,6]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
38
230
Exemplo Exemplo
4 10
1 9
1 8
1 7
0 6
1 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 6
Coloque x na lista L
L = [7,9,1,2,10,4,6]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
231
Exemplo Exemplo
4 10
1 9
1 8
1 7
0 6
1 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=3
4 10
Retire elemento do topo da
pilha, x
x = 6
Coloque x na lista L
L = [7,9,1,2,10,4,6]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o
na pilha
1 2
3
4
5
6
7
8
9
10
232
Exemplo Exemplo
4 10
1 9
1 8
1 7
0 6
1 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=3
4 10
Retire elemento do topo da
pilha, x
x = 3
Coloque x na lista L
L = [7,9,1,2,10,4,6]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
233
Exemplo Exemplo
4 10
1 9
1 8
1 7
0 6
1 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 3
Coloque x na lista L
L = [7,9,1,2,10,4,6,3]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
234
Exemplo Exemplo
4 10
1 9
1 8
1 7
0 6
0 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 3
Coloque x na lista L
L = [7,9,1,2,10,4,6,3]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
235
Exemplo Exemplo
4 10
1 9
1 8
1 7
0 6
0 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=5
4 10
Retire elemento do topo da
pilha, x
x = 3
Coloque x na lista L
L = [7,9,1,2,10,4,6,3]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o
na pilha
1 2
3
4
5
6
7
8
9
10
39
236
Exemplo Exemplo
4 10
1 9
1 8
1 7
0 6
0 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=5
4 10
Retire elemento do topo da
pilha, x
x = 5
Coloque x na lista L
L = [7,9,1,2,10,4,6,3]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
237
Exemplo Exemplo
4 10
1 9
1 8
1 7
0 6
0 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 5
Coloque x na lista L
L = [7,9,1,2,10,4,6,3,5]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
238
Exemplo Exemplo
4 10
1 9
0 8
1 7
0 6
0 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 5
Coloque x na lista L
L = [7,9,1,2,10,4,6,3,5]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
239
Exemplo Exemplo
4 10
1 9
0 8
1 7
0 6
0 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=8
4 10
Retire elemento do topo da
pilha, x
x = 5
Coloque x na lista L
L = [7,9,1,2,10,4,6,3,5]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o
na pilha
1 2
3
4
5
6
7
8
9
10
240
Exemplo Exemplo
4 10
1 9
0 8
1 7
0 6
0 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=8
4 10
Retire elemento do topo da
pilha, x
x = 8
Coloque x na lista L
L = [7,9,1,2,10,4,6,3,5]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
241
Exemplo Exemplo
4 10
1 9
0 8
1 7
0 6
0 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 8
Coloque x na lista L
L = [7,9,1,2,10,4,6,3,5,8]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
40
242
Exemplo Exemplo
4 10
1 9
0 8
1 7
0 6
0 5
0 4
0 3
0 2
0 1
link count
2 3
5
6 8
8
3
5 9
4 10
top=0
4 10
Retire elemento do topo da
pilha, x
x = 8
Coloque x na lista L
L = [7,9,1,2,10,4,6,3,5,8]
Decremente os contadores
dos sucessores x
Se algum sucessor ficar
com count=0, inclua-o na
pilha
1 2
3
4
5
6
7
8
9
10
243
Ordenao Topolgica Ordenao Topolgica
No algoritmo seguinte, assume-se que:
Ponteiros aterrados so indicados por NULL
ptr NULL;
Se ptr uma varivel do tipo ponteiro, ento
ptr-> refere-se ao que apontado por ptr
8
ptr
ptr
ptr->
244
Ordenao Topolgica Ordenao Topolgica
// n vrtices de um grafo so relacionados em ordem topolgica
procedure TopologicalOrder(n,count,link)
1 top 0; // inicialize a pilha
2 for i 1 to n do // crie uma pilha de ligao de vrtices sem predecessores
3 if count[i] = 0 then count[i] top; top i; endif
4 next i
5 for i 1 to n do // imprima os vrtices em ordem topolgica
6 if top = 0 then print('grafo tem um ciclo'); return; endif
7 j top; top count[top]; print(j); // coloque vrtice j na lista de sada
8 ptr link[j];
9 while ptr NULL do // decremente a contagem de vrtices sucessores de j
10 k ptr->vertex; // k o sucessor de j
11 count[k] count[k] 1;
12 if count[k] = 0 then // adicione vrtice k pilha
13 count[k] top; top k;
14 endif
14 ptr ptr->NextNode;
15 endwhile
16 next i
end TopologicalOrder
245
Ordenao Topolgica Ordenao Topolgica
Como resultado de uma escolha criteriosa de
estruturas de dados o algoritmo muito eficiente
Para uma rede com n vrtices e e arestas
o lao de linhas 2-4 requer um tempo de O(n)
as linhas 6-8 requerem O(n) para o algoritmo inteiro
o lao while precisa de tempo O(d
i
) para cada vrtice
i, onde d
i
o grau de sada do vrtice i (1 i n)
Uma vez que esse lao encontrado uma vez para cada
vrtice de sada, o tempo total para essa parte do algoritmo
de O((d
i
)+n) = O(e+n)
Portanto, o tempo assinttico de computao do
algoritmo O(e+n), ou seja, linear segundo o
tamanho do problema
246
Resumo Resumo
Grafos so estruturas de dados que
possuem um conjunto de vrtices e um
conjunto de arestas
Entre outros, foram vistos algoritmos
elementares de busca em grafos:
Profundidade
Largura
Observa-se que a eficincia de algoritmos
em grafos, em alguns casos, depende da
escolha adequada de estruturas de dados

Você também pode gostar