Algoritmos em Grafos (Parte 2) Katia S. Guimarães katia@cin.ufpe.br maio/2000 katia@cin.ufpe.br
Busca em Profundidade Exemplo: 1 A partir do grafo abaixo, obtemos a árvore: 6 4 6 5 1 2 Aresta de Árvore 3 7 4 3 Aresta de Retorno 2 7 5 maio/2000 katia@cin.ufpe.br
Busca em Profundidade Qual o custo de fazer busca em um grafo com n vértices e m arestas? Dentro do procedimento P, cada aresta na lista de incidências do vértice v é visitada, tomando um tempo (grau(v)). Sobre todas as chamadas de um grafo conexo, temos: grau(v), vV. grau(v) = 2.|E|. maio/2000 katia@cin.ufpe.br
Variações de Busca em Profundidade O algoritmo de busca em profundidade pode ser alterado para muitas aplicações em tempo linear. Ex. Base de Ciclos, isto é, um conjunto de ciclos a partir do qual todos os ciclos do grafo podem ser expressos. Ex. C1 = (1, 4 , 2, 3, 5, 1) C2 = (4, 2, 3, 4) C3 = C1 C2 = (1, 4, 3, 5, 1) 1 6 4 2 3 7 5 maio/2000 katia@cin.ufpe.br
Base de Ciclos P(v, pai) Insira v na pilha Q. Marque v como visitado Para toda aresta (v, w) incidente a v faça: Se w não marcado então P(w) /* aresta de árvore */ senão se w pai então /* aresta de retorno */ Se nível[v] > nível[w] então /* primeira vez que acha (v, w) */ Imprima (w, Q[topo], Q[topo-1], ..., Q[?] = w) senão nada senão /* aresta de árvore */ Remova v da pilha Q maio/2000 katia@cin.ufpe.br
Custo de Base de Ciclos Note que o algoritmo dado encontra a base de ciclos do grafo em tempo linear. No entanto, a impressão dos ciclos pode tomar tempo quadrático. Isso pode ser corrigido “lembrando” o nível das arestas de retorno que incidem em cada nó da árvore, e verificando qual o melhor (menor) ciclo a imprimir em caso de escolha. maio/2000 katia@cin.ufpe.br
Exercícios 1. Fazer uma implementação linear para o problema de Bases de Ciclos. 2. Dado um grafo G(V, E) não direcionado que contém exatamente um ciclo, direcionar as arestas de G de forma que todo vértice em V tenha grau 1. 3. Dado um grafo G(V, E) não direcionado, encontrar os componentes biconexos de G. maio/2000 katia@cin.ufpe.br
Busca em Largura Tome um vértice qualquer v. Coloque v na fila F. Enquanto F não for vazia faça v Primeiro elemento da fila F Para toda aresta (v, w) incidente a v faça Se w não marcado então Inclua w em F /* aresta de árvore */ senão se w = pai então /* aresta de árvore */ senão /* aresta de cruzamento */ maio/2000 katia@cin.ufpe.br
Busca em Largura A busca em largura biparticiona as arestas do grafo em arestas de árvore e arestas de cruzamento. 1 6 5 6 4 5 1 3 7 2 3 4 2 7 maio/2000 katia@cin.ufpe.br
Algoritmo Distâncias Se (v, w) é uma aresta em G, então |nível(v) - nível(w)| 1 na árvore de busca em largura. 1 6 4 5 D(v, w) é o menor número de arestas num caminho de v a w. A distância do vértice inicial a qualquer outro vértice na árvore é a distância entre estes vértices no grafo G. 2 3 7 maio/2000 katia@cin.ufpe.br
Algoritmo Distâncias com Pesos Quando o grafo tem peso nas arestas, D(v, w) é a menor soma dos pesos das arestas num caminho de v a w. Note que, nessas circunstâncias, o algoritmo de busca em largura já não resolve. 1 2 5 3 6 4 5 9 3 5 2 3 4 6 7 maio/2000 katia@cin.ufpe.br
Algoritmo Distâncias com Pesos Abordagem Algoritmo Guloso (Indução) - Inicialmente, só é conhecida uma solução trivial, para 0 ou 1 elemento do conjunto (no caso,D(v, v)). Marcar v. - A cada iteração, um elemento não marcado w é escolhido, baseado numa solução mínima local. w é marcado e incluído no conjunto dos elementos para os quais a solução é conhecida. maio/2000 katia@cin.ufpe.br
Algoritmo Distâncias com Pesos Abordagem Algoritmo Guloso (Indução) - Para todo v V faça { Desmarcar v; D[v] = } - D[s] = 0 /* Base da indução */ - Enquanto vértice não marcado faça /* Passo */ Seja v o vértice não marcado com D[v] mínimo (mínima local) Marque v; Para todo w Adj(v) faça Se D[v] + custo (v,w) < D[w] então D[w] D[v] + custo (v,w) maio/2000 katia@cin.ufpe.br
Algoritmo Distâncias com Pesos Abordagem Algoritmo Guloso (Indução) - Os vértices são marcados em ordem crescente de distância com relação ao vértice s. - É construída uma árvore, chamada Árvore de Distâncias de s, onde aparecem apenas as arestas que constituem os menores caminhos de s a cada um dos vértices do grafo. maio/2000 katia@cin.ufpe.br
Distâncias com Pesos - Implementação Para selecionar o mínimo D, usar um heap. Cada operação de inclusão/remoção custará (log |E|). Ter o cuidado de não fazer remoção no heap quando um novo custo for associado a um vértice. Para representar a árvore de distâncias, guardar, para cada vértice v, apenas a última aresta do caminho mínimo de s a v. maio/2000 katia@cin.ufpe.br
Distâncias com Pesos -Análise do Custo Operações de inclusão/remoção do heap Cada operação de inclusão/remoção custará (log |E|). O laço enquanto é executado |V| vezes, no entanto, como o heap vai conter elementos que não são candidatos de fato, a seleção do mínimo custará no total (|E| . log |E|). No total, o laço para todo será executado (|E|) vezes. maio/2000 katia@cin.ufpe.br
Árvore Geradora de Peso Mínimo Abordagem Algoritmo Guloso (Indução) OBJETIVO: Construir uma árvore de forma a manter o grafo conexo (há um caminho entre quaisquer dois vértices) porém a um custo mínimo. - Inicialmente, tomamos um vértice v qualquer. Marcar v. - A cada iteração, um elemento não marcado w é escolhido, baseado numa solução mínima local (mínimo custo de agregar um vértice à árvore corrente). maio/2000 katia@cin.ufpe.br
Algoritmo AGPM Abordagem Algoritmo Guloso (Indução) - Para todo v V faça { Desmarcar v; D[v] = } - D[s] = 0 /* Base da indução */ - Enquanto vértice não marcado faça /* Passo */ Seja v o vértice não marcado com D[v] mínimo (mínima local) Marque v; Para todo w Adj(v) faça Se custo (v,w) < D[w] então D[w] custo (v,w) maio/2000 katia@cin.ufpe.br
Problema Fluxo em Rede Def: Uma rede é um grafo direcionado com capacidades (de transmissão) nas arestas. OBJETIVO: Dados - Uma rede D (V, E, C), - Uma fonte s, e um destino t, definir um fluxo f máximo de s a t, obedecendo aos critérios: fin (v) = fout (v); fin (s) = 0; fout (t) = 0 f(v,w) c(v,w) maio/2000 katia@cin.ufpe.br
Problema Fluxo em Rede PERGUNTA: Algoritmo Guloso funciona? maio/2000 katia@cin.ufpe.br