Grafos – Parte 2 Projeto e Análise de Algoritmos Aline Vasconcelos aline.vasconcelos@terra.com.br
Conceitos Básicos Grafos Conectados: Um grafo não direcionado é conectado se cada par de vértices está conectado por um caminho. Os componentes conectados são conjuntos de vértices sob a relação “é alcançável a partir de”, ou seja, são porções conectadas de um grafo. Por exemplo, o grafo na figura B, tem 3 componentes, a saber: {0, 1, 2}, {4, 5} e {3}. Em outras palavras, um grafo não direcionado é conectado se ele tem exatamente um componente conectado, i.e., cada vértice é alcançável a partir de qualquer outro vértice.
Conceitos Básicos Grafos Fortemente Conectados: Um grafo direcionado G=(V, A) é fortemente conectado se cada dois vértices quaisquer são alcançáveis a partir um do outro. Os componentes fortemente conectados de um grafo direcionado são as classes de equivalência de vértices sob a relação “são mutuamente alcançáveis”. Por exemplo, o grafo na figura A, tem 3 componentes fortemente conectados, a saber: {0, 1, 2, 3}, {4} e {5}. Todos os pares em {0, 1, 2, 3} são mutuamente alcançáveis. Por outro lado, os vértices 4 e 5 não formam um componente fortemente conectado porque o vértice 5 não é alcançável a partir do vértice 4. Assim, um grafo direcionado fortemente conectado tem apenas 1 componente fortemente conectado.
Exemplo: (A) (B) 4 1 4 1 3 2 3 2 5 5
Conceitos Básicos Grafos Isomorfos: Dois grafos G=(V, A) e G’=(V’, A’) são isomorfos se existir uma bijeção ƒ : V V’ tal que (u, v) A se e somente se (ƒ(u), ƒ(v)) A’. Em outras palavras, deve ser possível re-rotular os vértices de G para serem rótulos de G’, mantendo as arestas correspondentes em G e G’. O exemplo da Figura C mostra 2 grafos isomorfos G e G’ com seus conjuntos de vértices V = {0, 1, 2, 3, 4, 5, 6, 7} e V’= {s, t, u, v, w, x, y, z} respectivamente.
Grafos Isomorfos (C) t 1 s w x 4 5 y u v z 6 7 3 2
Conceitos Básicos Subgrafo: Um grafo G’ = (V’, A’) é um subgrafo de G = (V, A) se V’ V e A’ A. Dado um conjunto V’ V, o subgrafo induzido por V’ é o grafo G’ = (V’, A’), em que A’ = {(u, v) A | u, v V’}
Conceitos Básicos Na transformação de um grafo não direcionado em sua versão direcionada, cada aresta não direcionada é substituída por duas arestas direcionadas. Um grafo completo é um grafo não direcionado no qual todos os pares de vértices são adjacentes, ou seja, possui arestas ligando todos os vértices entre si. Uma árvore livre (Figura D) é um grafo não direcionado acíclico e conectado. É comum omitir-se o adjetivo “livre” quando dizemos que o grafo é uma árvore.
Conceitos Básicos Uma floresta é um grafo não direcionado acíclico, podendo ou não ser conectado (Figura E). (D) (E)
Algoritmos em Grafos Busca em Profundidade (depth-first search): É um algoritmo para caminhar no grafo . A estratégia seguida pelo algoritmo é a de buscar o mais profundo no grafo sempre que possível. Na busca em profundidade, as arestas são exploradas a partir do vértice v mais recentemente descoberto que ainda possui arestas não exploradas saindo dele. Quando todas as arestas adjacentes a v tiverem sido exploradas, a busca anda para trás (i.e. backtracking ou backtrack) para explorar vértices que saem do vértice do qual v foi descoberto.
Algoritmos em Grafos Busca em Profundidade (depth-first search): O processo continua até que sejam descobertos todos os vértices que são alcançáveis a partir do vértice original. O algoritmo é a base para muitos outros algoritmos importantes na área de grafos, tais como: Verificação de grafos acíclicos; Componentes fortemente conectados etc.
Algoritmos em Grafos Busca em Largura (breadth-first search): É assim chamada porque ela expande a fronteira entre vértices descobertos e não descobertos uniformemente por meio da largura da fronteira, como se fossem círculos concêntricos gerados por uma pedra que se deixa cair em uma superfície de água completamente parada. O algoritmo é a base para muitos algoritmos importantes em grafos, como o algoritmo de Dijkstra para obter o caminho mais curto de um vértice a todos os outros vértices.
Algoritmos em Grafos Busca em Largura (breadth-first search): Dados um grafo G (V, A) e um vértice origem, o algoritmo de busca em largura descobre todos os vértices a uma distância k do vértice origem antes de descobrir qualquer vértice a uma distância k + 1. O grafo G (V, A) pode ser direcionado ou não direcionado.