Aula 2
Representação computacional de grafos
A eficiência do algoritmo vai depender da escolha certa de como representar um grafo.
MATRIZ DE ADJACÊNCIA
Dado um grafo G(V,E), a matriz de adjacência 𝐴 = [𝑎𝑖𝑗 ] é uma matriz 𝑛x𝑛 tal que
1 se e somente se (𝑣𝑖 , 𝑣𝑗 ) ∈ 𝐸
𝑎𝑖𝑗 = {
0 caso contrário
Isto significa que 𝑎𝑖𝑗 = 1, quando os vértices 𝑣𝑖 e 𝑣𝑗 são adjacentes, e 𝑎𝑖𝑗 = 0 em caso contrário.
Obs.: Para um grafo não dirigido a matriz de adjacência é simétrica.
Exemplos:
a)
b)
1
MATRIZ DE CUSTO
Um grafo simples valorado pode ser representado por uma matriz de custo 𝑊 = [𝑤𝑖𝑗 ] é uma matriz
𝑛x𝑛 tal que
custo da aresta, se 𝑣𝑖 , 𝑣𝑗 são adjacentes
𝑤𝑖𝑗 = {
0 ou ∞, caso não exista aresta
Exemplo:
MATRIZ DE INCIDÊNCIA
Dado um grafo G(V,E), de n vértices e m arestas, a matriz de incidência de G é denotada por 𝐵 = [𝑏𝑖𝑗 ]
é uma matriz 𝑛x𝑚 tal que
1 se 𝑣𝑖 é vértice de 𝑎𝑗
𝑏𝑖𝑗 = {
0 caso contrário, ou se for laço
Se o grafo G for orientado, então poderá ser definido como:
1 se 𝑣𝑖 é vértice inicial de 𝑎𝑗
𝑏𝑖𝑗 = { −1 se 𝑣𝑖 é 𝑣értice final de 𝑎𝑗
0 se o vértice 𝑣𝑖 𝑛ão pertence a aresta 𝑎𝑗 ou 𝑎𝑗 for um laço
2
Exemplo: Representar os grafos via matriz de incidência:
a)
b)
3
Exercício: Represente os grafos por matriz de adjacência e de incidência:
a)
b)
c)
4
CADEIA
Uma cadeia é uma sequência qualquer de arestas adjacentes que ligam os vértices. O conceito
de cadeia vale também para grafos orientados, bastando
que se ignore o sentido da orientação dos arcos. A
sequência de vértices (𝑥6 , 𝑥5 , 𝑥4 , 𝑥1 ) é um exemplo de
cadeia do grafo ao lado.
Uma cadeia é elementar se não passa duas vezes pelo mesmo vértice. Uma cadeia é simples se
não passa duas vezes pela mesma aresta. O comprimento de uma cadeia é o número de arestas que a
compõe.
Exemplo: Cadeia não elementar: (𝑥6 , 𝑥3 , 𝑥2 , 𝑥5 , 𝑥6 )
Cadeia não simples: (𝑥6 , 𝑥5 , 𝑥4 , 𝑥1 , 𝑥2 , 𝑥5 , 𝑥4 )
CAMINHO
Definição: Seja G(V,E) um grafo. Então define-se um caminho de G como sendo uma sequência de
arestas da forma (𝑢, 𝑣), (𝑣, 𝑤), (𝑤, 𝑥), . . . , (𝑦, 𝑧), onde cada
aresta pertence ao grafo G. O caminho denotado acima é
definido, também, como o caminho entre 𝑢 e 𝑧 e pode ser
representado por 𝑢 𝑣 𝑤 𝑥 . . . 𝑦 𝑧.
O exemplo ao lado mostra um caminho entre 𝑑 e 𝑐.
O caminho é denotado por 𝑑𝑎𝑏𝑐.
Obs.: Todo caminho é uma cadeia, porém a recíproca nem sempre é verdadeira. Veja o exemplo:
A sequência 𝑎𝑏𝑐𝑑 é um caminho e também é uma cadeia. A sequência
𝑎𝑏𝑑𝑐 é uma cadeia, mas não é um caminho.
Caminho: segue a orientação
Cadeia: não precisa seguir a orientação
5
CICLO: Um ciclo é uma cadeia simples e fechada ( o vértice
inicial é o mesmo que o vértice final). Ex.: dcbd
CIRCUITO: Um circuito é um caminho fechado. Ex.: abcda
GRAFO CONEXO: Um grafo G=(V,E) é conexo quando existe um caminho (ou cadeia) entre cada
par de V. Caso contrário o grafo é desconexo.
Grafo conexo Grafo desconexo
Assim, um grafo desconexo consiste de dois ou mais subgrafos conexos. Cada um desses
subgrafos é chamado de componente conexa .
GRAFO FORTEMENTE CONEXO: No caso de grafos orientados, um grafo é dito fortemente conexo
(f-conexo) se cada par de vértices participa de um circuito. Isto significa que cada vértice pode ser
alcançável, partindo-se de qualquer outro vértice do grafo.
Exemplo: 1 ↔ 6
COMPONENTE FORTEMENTE CONEXA: Uma componente fortemente conexa de um grafo
G(V,E) é definida como a interseção do fecho transitivo direto com o fecho transitivo indireto.
6
FECHO TRANSITIVO:
Fecho transitivo direto (ftd) de um vértice 𝑣, é o conjunto de todos os vértices que podem ser
atingidos por algum caminho iniciado em 𝑣.
Exemplo:
O ftd do vértice 𝑥5 é {𝑥1 , 𝑥2 , 𝑥3 , 𝑥4 , 𝑥5 , 𝑥6 }. Note que o
próprio vértice faz parte do ftd.
O fecho transitivo indireto (fti) de um vértice 𝑣, é o conjunto
de todos os vértices a partir dos quais pode-se atingir 𝑣 por algum
caminho. O fti do vértice 𝑥5 é {𝑥1 , 𝑥2 , 𝑥4 , 𝑥5 , 𝑥7 }.
Exemplo: Considere o grafo seguinte. Encontre suas componentes fortemente conexas.
7
GRAFO REDUZIDO
Define-se o grafo G*(V*,E*) tal que cada um de seus vértices represente o conjunto de vértices de
uma componente fortemente conexa de G, e a aresta (𝑣𝑖∗ , 𝑣𝑗∗ ) exista, se e somente se, existir uma aresta
(𝑣𝑘 , 𝑣ℎ ) em G tal que 𝑣𝑘 ∈ 𝑣𝑖∗ e 𝑣ℎ ∈ 𝑣𝑗∗ . Um grafo assim definido é chamado grafo reduzido.
A figura seguinte mostra o grafo reduzido do exemplo anterior:
𝑣1∗ = {𝑣1 , 𝑣2 , 𝑣5 , 𝑣6 }
𝑣2∗ = {𝑣8 , 𝑣10 }
𝑣3∗ = {𝑣4 , 𝑣7 , 𝑣9 }
𝑣4∗ = {𝑣11 , 𝑣12 , 𝑣13 }
𝑣5∗ = {𝑣3 }
As operações descritas para achar as componentes fortemente conexas de um grafo, podem ser
determinadas diretamente, pelo uso das matrizes R e Q.
A matriz 𝑅 = [𝑟𝑖𝑗 ] é definida como
1 se o vértice 𝑣𝑗 pode ser atingido partindo − se do vértice de 𝑣𝑖
𝑟𝑖𝑗 = {
0 caso contrário
E a matriz Q é definida como a matriz transposta de R, isto é, 𝑄 = 𝑅 𝑇 .
Faz-se 𝑅 ⊗ 𝑄 para achar as componentes fortemente conexas. O produto é feito elemento a
elemento.
Exemplo: Achar as componentes f-conexas
do grafo abaixo, usando as matrizes Q e R.
Em seguida, achar o grafo reduzido G*.