TREINAMENTO PARA COMPETIÇÕES DE PROGRAMAÇÃOGRAFOS PARTE 1                   TAP             TURMA INICIANTEMurilo Adriano ...
Grafos: Introdução        2
Grafos• O que é um grafo?• Tipos de grafos• Representações de grafos• Algoritmos de busca• Aplicações dos algoritmos de bu...
O que é um grafo?• Uma representação abstrata que pode ser  usada para descrever a organização de  sistemas de transportes...
O que é um grafo?Matematicamente denotado como:G = (V, E), onde V é o conjunto de vérticese E o conjunto de arestas (edges...
Tipos de grafos• Direcionados / Não-direcionados• Ponderados / Não-ponderados• Cíclicos / Acíclicos• Esparsos / Densos    ...
Grafos Não-Direcionados• Um grafo G(V, E) é dito não-  direcionado se a existência de uma  aresta (u, v) ∈ E implica que a...
Grafos Direcionados• Se a presença de uma aresta (u, v) não  implica na existência da aresta (v, u) então  dizemos que o g...
Grafos Não-Direcionados / Direcionados    Não-direcionado       Direcionado                                 *Figuras retir...
Grafos Ponderados• Em um grafo ponderado, cada aresta (ou  vértice) possui um valor que pode denotar  o peso, custo, ganho...
Grafos Não-ponderados• Em um grafo não-ponderado, não há  distinção de custo ou valor entre as  arestas. Isto é, cada ares...
Grafos Não-Ponderados / Ponderados   Não-ponderado        Ponderado                              *Figuras retiradas de [TA...
Grafos Cíclicos• Um grafo cíclico é um grafo que não  contém ciclos, ou seja, se partindo de um  vértice v, conseguimos ch...
Grafos Acíclicos• Um grafo é acíclico se não contém ciclos• Grafos conexos não-direcionados acíclicos?• Árvores!!!• Grafos...
Grafos Acíclicos / CíclicosAcíclico            Cíclico                         *Figuras retiradas de [TADM] p.147         ...
Grafos Esparsos / Densos• Um grafo G(V, E) é chamado esparso se  |E| for muito menor que |V|2• Se um grafo possui o número...
Representações de grafos• Duas formas principais • Matrizes de adjacência • Lista de adjacência• É de suma importância sab...
Representações de grafos: Matrizes de adjacência                  -   1   2   3   4   5 1       2                  1   1  ...
Representações de grafos:   Matrizes de adjacência• Vantagens: • Facilidade e rapidez de implementação • Fácil checar se a...
Representações de grafos:    Listas de adjacência• Podemos representar grafos esparsos de  uma forma mais eficiente com lis...
Representações de grafos:      Listas de adjacência•   Vantagens    • Menor consumo de memória (n + m)    •   Não contém a...
Representações de grafos:         Comparativo        Comparação                                  VencedorChecar se (u, v) ...
Implementação: Matrizes de adjacência// Declarandoconst int MAX_VERTICES = 100;tipo grafo[MAX_VERTICES][MAX_VERTICES];// I...
Implementação: Listas de adjacência#include <list> // std::list#include <utility> // pair<> e make_pair()using namespace s...
Algoritmos de busca em grafos• Dois principais: • Busca em largura (ou Breadth-First Search    - BFS) • Busca em profundid...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice    primeiro:                   ...
Implementação: Busca em largura#include <list> // std::list#include <utility> // pair<> e make_pair()using namespace std;/...
Implementação: Busca em larguravoid bfs(int origem, int num_vertices) {    for (int i = 0; i < num_vertices; ++i) {       ...
Algoritmos de busca em grafos - Busca em largura               3                            5               2             ...
Algoritmos de busca em grafos - Busca em largura               3                            5               2             ...
Algoritmos de busca em grafos - Busca em largura                                         VISITADO                         ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0                                   VISITADO                        ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0                                   VISITADO                        ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0                                   VISITADO                        ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0                                   VISITADO                        ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0      3                                   VISITADO                 ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0      3                                   VISITADO                 ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0      3                                   VISITADO                 ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2      3                                   VISITADO               ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2      3                                   VISITADO               ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2      3                                   VISITADO               ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      3                                    VISITADO            ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      3                                    VISITADO            ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      3                                    VISITADO            ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      3                                    VISITADO            ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      2      31                                   VISITADO     ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      2      31                                   VISITADO     ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      2      315                                  VISITADO     ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      2      315                                  VISITADO     ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      2      315                                  VISITADO     ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      2      315                                  VISITADO     ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      1      25      315                                  VISIT...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      1      25      315                                  VISIT...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      1      256      315                                  VISI...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      1      256      315                                  VISI...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      1      256      315                                  VISI...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      1      256      315                                  VISI...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      5      16      256      315                              ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      5      16      256      315                              ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      5      16      256      315                              ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      6      5      16      256      315                       ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      6      5      16      256      315                       ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      6      5      16      256      315                       ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      6      5      16      256      315                       ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      6      5      16      256      315                       ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      4      6      5      16      256      315                ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      4      6      5      16      256      315                ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      4      6      5      16      256      315                ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      4      6      5      16      256      315                ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      4      6      5      16      256      315                ...
Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1      4      6      5      16      256      315                ...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Algoritmos de busca em grafos - Busca em                profundidade• Explora primeiro o último vértice  colocado na lista...
Implementação: Busca em profundidade// Declarandoconst int MAX_VERTICES = 100;int grafo[MAX_VERTICES][MAX_VERTICES];bool v...
Grafos: Aplicações
Aplicações• Verificar se um grafo é bicolorível• Detecção de Ciclos• Ordenação Topológica• Caminhos Mínimos (Grafos não  po...
Aplicações:          Bicoloração• Em algumas espécies é difícil distinguir os  machos das fêmeas, como é o caso de uma  es...
Aplicações:            Bicoloração•   São feitas anotações sempre que dois indivíduos    se “relacionam”.•   A espécie não...
Aplicações:            Bicoloração•   Dadas as anotações sobre as interações entre    os indivíduos, o Dr. que coordena o ...
Aplicações:             Bicoloração• O problema pode ser modelado em um  grafo não direcionado.• Indivíduos são os vértice...
Aplicações:              Bicoloração•   Queremos saber se é possível separar os    vértices em dois conjuntos, onde os vér...
Aplicações:            Bicoloração•   E como fazer essa verificação ?•   Fácil ! Basta fazer uma busca em largura..•   Come...
Aplicações:                Bicoloração#include <iostream>#include <list>using namespace std;int main(){    int u, v, num_i...
Aplicações:             Bicoloraçãowhile( num_relacoes-- ){  cin >> u >> v;  grafo[u].push_back( v );  grafo[v].push_back(...
Aplicações:              Bicoloração while( !fila.empty() && bipartido ){  u = fila.front(); fila.pop_front();  for( w = graf...
Aplicações:                    Bicoloração    }    if( bipartido ) cout << “Possivel distinguir os sexosn”;    else cout <...
Aplicações:  Detecção de Ciclos• Sabemos que existem grafos cíclicos e  acíclicos.• Mas dado um grafo, como seria uma  alg...
Aplicações:    Detecção de Ciclos•   Durante um DFS, podemos classificar as    arestas do grafo em 3 tipos, são eles:    • ...
Aplicações:Detecção de Ciclos•   Um grafo tem um ciclo, se e somente se ele    possui uma aresta de retorno.•   Portanto, ...
Aplicações:Detecção de Ciclos•   A idéia apesar de muito parecida funciona    de maneiras diferentes para grafos    orient...
Aplicações:Detecção de Ciclos•   Quando um vértice tem uma aresta para    um vértice pintado de preto ( que já foi    desc...
Aplicações:Detecção de Ciclos•   Nos grafos orientados, o fato de um    vizinho já ter sido descoberto não significa    que...
Aplicações:Detecção de Ciclos•   Num grafo direcionado uma aresta de    retorno é uma aresta que aponta para um    vértice...
Aplicações:       Detecção de Ciclosbool ciclico(){    for( int u = 1; u <= num_vert; u++ )      cor[u] = -1;    for( int ...
Aplicações:        Detecção de Ciclosbool dfsC( int u ){ // versao para grafos nao orientados cor[u] = 1;    for( list<int...
Aplicações:        Detecção de Ciclosbool dfsC( int u ){ // versao para grafos orientados cor[u] = 1; // vertice u foi des...
Aplicações:Ordenação Topológica• No curso de Ciência da Computação  algumas disciplinas possuem pré-requisitos.• Dadas as ...
Aplicações:Ordenação Topológica• As disciplinas podem ser vistas como os  vértices de um grafo;• Existe uma aresta direcio...
Aplicações:Ordenação Topológica• Uma ordenação topológica ordena os  vértices em uma linha de modo que as  arestas são tod...
Aplicações:Ordenação Topológica• Mas como fazer uma ordenação  topológica ?   • Simples! Basta uma busca em      profundid...
Aplicações:Ordenação Topológica•   Na busca em profundidade depois que    analisamos todas as arestas que saem de um    vé...
Aplicações:      Ordenação Topológicabool gera_ordenacao(){ ordem.clear(); // pilha onde a ordenacao sera armazenada    fo...
Aplicações:    Ordenação Topológicabool dfsT( int u ){    cor[u] = 1; // vertice u foi descoberto    for( list<int>::itera...
Aplicações:  Caminhos Mínimos• Num grafo não ponderado, quando  queremos encontrar o menor caminho do  vértice s ao vértic...
Aplicações:   Caminhos Mínimos• Por que ? • Se as arestas não tem pesos diferentes, o    custo do menor caminho de s para ...
Aplicações: Caminhos Mínimos• Dado o funcionamento da busca em  largura, isso é exatamente o que ela  calcula.• Primeiro t...
Aplicações:          Caminhos Mínimosint menorCaminho( int s, int t ){    int dist[num_vert];    memset( dist, -1, sizeof(...
continua..
Referências e bibliografia•   [TADM] - Steven S. Skiena -The Algorithm Design Manual•   Thomas H. Cormen, Charles E. Leiser...
Próximos SlideShares
Carregando em…5
×

Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Turma Iniciantes

3.163 visualizações

Publicada em

Slides da apresentação que fizemos sobre o básico de algoritmos em grafos para a turma iniciante de Tópicos Avançados em Programação do Instituto de Informática da UFG. Abordamos busca em largura, busca em profundidade e algumas aplicações desses algoritmos.

2 comentários
8 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
3.163
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
225
Comentários
2
Gostaram
8
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Turma Iniciantes

    1. 1. TREINAMENTO PARA COMPETIÇÕES DE PROGRAMAÇÃOGRAFOS PARTE 1 TAP TURMA INICIANTEMurilo Adriano Vasconcelos e Paulo Cezar P. Costa - INF/UFG http://murilo.wordpress.com 1
    2. 2. Grafos: Introdução 2
    3. 3. Grafos• O que é um grafo?• Tipos de grafos• Representações de grafos• Algoritmos de busca• Aplicações dos algoritmos de busca 3
    4. 4. O que é um grafo?• Uma representação abstrata que pode ser usada para descrever a organização de sistemas de transportes, interações humanas, redes de telecomunicação entre outros. 4
    5. 5. O que é um grafo?Matematicamente denotado como:G = (V, E), onde V é o conjunto de vérticese E o conjunto de arestas (edges) formadopor pares ordenados ou não de vértices doconjunto V. 5
    6. 6. Tipos de grafos• Direcionados / Não-direcionados• Ponderados / Não-ponderados• Cíclicos / Acíclicos• Esparsos / Densos 6
    7. 7. Grafos Não-Direcionados• Um grafo G(V, E) é dito não- direcionado se a existência de uma aresta (u, v) ∈ E implica que a aresta (v, u) também pertence a E• Estradas interligando cidades são exemplos de relações que podem ser representadas por grafos não-direcionados uma vez que as estradas possuem duplo sentido 7
    8. 8. Grafos Direcionados• Se a presença de uma aresta (u, v) não implica na existência da aresta (v, u) então dizemos que o grafo é direcionado• Ruas de uma cidade podem ser vistas como um grafo direcionado pois nem todas as ruas possuem mão-dupla. 8
    9. 9. Grafos Não-Direcionados / Direcionados Não-direcionado Direcionado *Figuras retiradas de [TADM] p.147 9
    10. 10. Grafos Ponderados• Em um grafo ponderado, cada aresta (ou vértice) possui um valor que pode denotar o peso, custo, ganho etc.• Em um grafo representando as cidades e as estradas que as interligam, os valores das arestas podem representar, por exemplo, o comprimento, o tempo de direção, o limite de velocidade ou o custo do pedágio de cada estrada. 10
    11. 11. Grafos Não-ponderados• Em um grafo não-ponderado, não há distinção de custo ou valor entre as arestas. Isto é, cada aresta possui o mesmo valor.• Este tipo de grafo é utilizado quando o que importa são somente os relacionamentos. 11
    12. 12. Grafos Não-Ponderados / Ponderados Não-ponderado Ponderado *Figuras retiradas de [TADM] p.147 12
    13. 13. Grafos Cíclicos• Um grafo cíclico é um grafo que não contém ciclos, ou seja, se partindo de um vértice v, conseguimos chegar a um vértice u, então a partir de u não conseguimos chegar novamente a v a não ser voltando pelo caminho usado de v até u 13
    14. 14. Grafos Acíclicos• Um grafo é acíclico se não contém ciclos• Grafos conexos não-direcionados acíclicos?• Árvores!!!• Grafos direcionados acíclicos (DAGs) 14
    15. 15. Grafos Acíclicos / CíclicosAcíclico Cíclico *Figuras retiradas de [TADM] p.147 15
    16. 16. Grafos Esparsos / Densos• Um grafo G(V, E) é chamado esparso se |E| for muito menor que |V|2• Se um grafo possui o número de arestas (| E|) próximo do número de vértices ao quadrado (|V|2), então dizemos que este grafo é denso. 16
    17. 17. Representações de grafos• Duas formas principais • Matrizes de adjacência • Lista de adjacência• É de suma importância saber identificar a representação correta para a resolução de problemas 17
    18. 18. Representações de grafos: Matrizes de adjacência - 1 2 3 4 5 1 2 1 1 1 0 1 0 2 1 1 0 1 0 3 4 3 0 0 1 1 1 5 4 1 1 0 1 1 5 0 0 1 1 1 18
    19. 19. Representações de grafos: Matrizes de adjacência• Vantagens: • Facilidade e rapidez de implementação • Fácil checar se a aresta (i, j) existe ou não• Desvantagens: • Alocar uma matriz n pode não ser bom 2 • Ex.: 3000 de 4 bytes! de 9,000,000 posicões cidades, array 19
    20. 20. Representações de grafos: Listas de adjacência• Podemos representar grafos esparsos de uma forma mais eficiente com listas de adjacência• Cada vértice possui uma lista de vértices associada• Se existe uma aresta (u, v) no grafo então a lista do vértice u contém o vértice v 20
    21. 21. Representações de grafos: Listas de adjacência• Vantagens • Menor consumo de memória (n + m) • Não contém arestas inexistentes no grafo original, diminuindo assim a complexidade de buscas no grafo• Desvantagens •Codificação mais demorada •Checar se a aresta (u, v) existe é mais demorado 21
    22. 22. Representações de grafos: Comparativo Comparação VencedorChecar se (u, v) pertence ao grafo matrizes de adjacência O(1)Checar o grau de um vértice listas de ajacênciaMemória em grafos pequenos listas de adjacência (n + m) vs n2Inserção ou remoção de arestas matrizes de adjacência O(1) vs O(d)Busca em grafos listas de ajacência Θ(m + n) vs Θ(n2)Velocidade de implementação matrizes de adjacênciaMelhor para a maioria dos problemas listas de ajacência *Sugerido por [TADM] p.152 22
    23. 23. Implementação: Matrizes de adjacência// Declarandoconst int MAX_VERTICES = 100;tipo grafo[MAX_VERTICES][MAX_VERTICES];// Inicializandofor (int i = 0; i < num_arestas; ++i) for (int j = i; j < num_arestas; ++j) grafo[i][j] = grafo[j][i] = 0;// Populandoint u, v;for (int i = 0; i < num_arestas; ++i) { cin >> u >> v; grafo[u][v] = w; // grafo[v][u] = w; se não for direcionado // grafo[u][v] = true; se não for ponderado} 23
    24. 24. Implementação: Listas de adjacência#include <list> // std::list#include <utility> // pair<> e make_pair()using namespace std;// Declarandoconst int MAX_VERTICES = 100;list< pair<tipo, int> > grafo[MAX_VERTICES];// Inicializandofor (int i = 0; i < num_arestas; ++i) grafo[i].clear();// Populandoint u, v, w;for (int i = 0; i < num_arestas; ++i) { cin >> u >> v >> w; grafo[u].push_back(make_pair(v,w));}Nem tão mais complicado assim... :) 24
    25. 25. Algoritmos de busca em grafos• Dois principais: • Busca em largura (ou Breadth-First Search - BFS) • Busca em profundidade (ou Depth-First Search - DFS) 25
    26. 26. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    27. 27. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    28. 28. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    29. 29. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    30. 30. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    31. 31. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    32. 32. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    33. 33. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    34. 34. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    35. 35. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    36. 36. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    37. 37. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    38. 38. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    39. 39. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    40. 40. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    41. 41. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    42. 42. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    43. 43. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    44. 44. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    45. 45. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    46. 46. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
    47. 47. Implementação: Busca em largura#include <list> // std::list#include <utility> // pair<> e make_pair()using namespace std;// Declarandoconst int MAX_VERTICES = 100;int grafo[MAX_VERTICES][MAX_VERTICES];bool visitado[MAX_VERTICES];void bfs(int origem, int num_vertices) { for (int i = 0; i < num_vertices; ++i) { visitado[i] = false; } // Fila que guarda a ordem de visita dos vértices list<int> fila;/*...*/ 27
    48. 48. Implementação: Busca em larguravoid bfs(int origem, int num_vertices) { for (int i = 0; i < num_vertices; ++i) { visitado[i] = false; } // Fila que guarda a ordem de visita dos vértices list<int> fila; // Adiciona a origem na fila fila.push_back(origem); visitado[origem] = true; int atual; // vértice atual que estamos visitando while (!fila.empty()) { atual = fila.front(); // pega o 1o vértice fila.pop_front(); // remove ele da fila for (int i = 0; i < num_vertices; ++i) { if (grafo[atual][i] && !visitado[i]) { lista.push_back(i); visited[i] = true; } } } 28
    49. 49. Algoritmos de busca em grafos - Busca em largura 3 5 2 4 0 6 1 29
    50. 50. Algoritmos de busca em grafos - Busca em largura 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    51. 51. Algoritmos de busca em grafos - Busca em largura VISITADO 0 1 2 3 4 5 6 F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    52. 52. Algoritmos de busca em grafos - Busca em larguraFILA: 0 VISITADO 0 1 2 3 4 5 6 F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    53. 53. Algoritmos de busca em grafos - Busca em larguraFILA: 0 VISITADO 0 1 2 3 4 5 6 F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    54. 54. Algoritmos de busca em grafos - Busca em larguraFILA: 0 VISITADO 0 1 2 3 4 5 6 T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    55. 55. Algoritmos de busca em grafos - Busca em larguraFILA: 0 VISITADO 0 1 2 3 4 5 6 T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    56. 56. Algoritmos de busca em grafos - Busca em larguraFILA: 0 3 VISITADO 0 1 2 3 4 5 6 T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    57. 57. Algoritmos de busca em grafos - Busca em larguraFILA: 0 3 VISITADO 0 1 2 3 4 5 6 T F F F T F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    58. 58. Algoritmos de busca em grafos - Busca em larguraFILA: 0 3 VISITADO 0 1 2 3 4 5 6 T F F F T F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    59. 59. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 3 VISITADO 0 1 2 3 4 5 6 T F F F T F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    60. 60. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 3 VISITADO 0 1 2 3 4 5 6 T F F T T F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    61. 61. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 3 VISITADO 0 1 2 3 4 5 6 T F F T T F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    62. 62. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 3 VISITADO 0 1 2 3 4 5 6 T F F T T F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    63. 63. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 3 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    64. 64. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 3 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    65. 65. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 3 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    66. 66. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 2 31 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    67. 67. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 2 31 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    68. 68. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 2 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    69. 69. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 2 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    70. 70. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 2 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    71. 71. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 2 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    72. 72. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 1 25 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    73. 73. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 1 25 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    74. 74. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 1 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    75. 75. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 1 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    76. 76. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 1 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    77. 77. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 1 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    78. 78. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    79. 79. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    80. 80. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    81. 81. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 6 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    82. 82. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 6 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    83. 83. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 6 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    84. 84. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 6 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    85. 85. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 6 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    86. 86. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 4 6 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T F F F F F T T F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    87. 87. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 4 6 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T T T T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    88. 88. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 4 6 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T T T T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    89. 89. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 4 6 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T T T T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    90. 90. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 4 6 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T T T T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    91. 91. Algoritmos de busca em grafos - Busca em larguraFILA: 0 2 1 4 6 5 16 256 315 VISITADO 0 1 2 3 4 5 6 T T T T T T T F F F F F F F 3 5 2 4 0 0 1 2 3 4 5 6 6 0 - 1 1 1 0 0 0 1 1 - 0 0 0 0 1 1 2 1 0 - 0 0 0 1 3 1 0 0 - 0 1 0 4 0 0 0 0 - 0 1 5 0 0 0 1 0 - 0 6 0 1 1 0 1 0 - 29
    92. 92. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    93. 93. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    94. 94. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    95. 95. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    96. 96. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    97. 97. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    98. 98. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    99. 99. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    100. 100. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    101. 101. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    102. 102. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    103. 103. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    104. 104. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    105. 105. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    106. 106. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    107. 107. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    108. 108. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    109. 109. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    110. 110. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    111. 111. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    112. 112. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    113. 113. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    114. 114. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    115. 115. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    116. 116. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    117. 117. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    118. 118. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    119. 119. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    120. 120. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    121. 121. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    122. 122. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    123. 123. Algoritmos de busca em grafos - Busca em profundidade• Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
    124. 124. Implementação: Busca em profundidade// Declarandoconst int MAX_VERTICES = 100;int grafo[MAX_VERTICES][MAX_VERTICES];bool visitado[MAX_VERTICES];int num_vertices; // qtd de vértices do grafo atual// Recursivamente visita todos os vértices// alcançáveis a partir de atualvoid dfs(int atual) { for (int i = 0; i < num_vertices; ++i) { if (grafo[atual][i] && !visitado[i]) { visitado[i] = true; dfs(i); } }} 31
    125. 125. Grafos: Aplicações
    126. 126. Aplicações• Verificar se um grafo é bicolorível• Detecção de Ciclos• Ordenação Topológica• Caminhos Mínimos (Grafos não ponderados)• Conectividade
    127. 127. Aplicações: Bicoloração• Em algumas espécies é difícil distinguir os machos das fêmeas, como é o caso de uma espécie recém descoberta, os happyRockers.• Num laboratório são realizadas experiências para determinar potenciais machos e fêmeas em uma amostra.
    128. 128. Aplicações: Bicoloração• São feitas anotações sempre que dois indivíduos se “relacionam”.• A espécie não é monogâmica, portanto um indivíduo A pode tranquilamente ter relações com os indivíduo B e C.• Porém, os sexos são bem definidos, machos apenas se relacionam com fêmeas e vice-versa. Então, se A se relaciona com B e C, estes são do mesmo sexo, o qual é diferente do sexo de A.
    129. 129. Aplicações: Bicoloração• Dadas as anotações sobre as interações entre os indivíduos, o Dr. que coordena o laboratório quer saber se é possível distinguir quais indivíduos tem o mesmo sexo ou se existem indivíduos suspeitos no grupo.• Como resolver ?
    130. 130. Aplicações: Bicoloração• O problema pode ser modelado em um grafo não direcionado.• Indivíduos são os vértices, relações são as arestas.• Tá, e agora ?
    131. 131. Aplicações: Bicoloração• Queremos saber se é possível separar os vértices em dois conjuntos, onde os vértices pertencentes a cada conjunto não se relacionaram durante o experimento.• Ah, que legal, e como faço isso ?!? • Basta verificar se é possível colorir os vértices do grafo usando apenas duas cores, ou seja, verificar se o grafo é bicolorível/ bipartido.
    132. 132. Aplicações: Bicoloração• E como fazer essa verificação ?• Fácil ! Basta fazer uma busca em largura..• Começamos um BFS de cada vértice ainda não colorido, pintando ele de branco e adicionando na fila;• Quando tira-se um vértice da fila e vai processar seus vizinhos, tenta pintar eles da cor contrária a que o vértice atual está pintado.
    133. 133. Aplicações: Bicoloração#include <iostream>#include <list>using namespace std;int main(){ int u, v, num_individuos, num_relacoes; list< int >::iterator w; cin >> num_individuos >> num_relacoes; list< int > grafo[num_individuos+1]; int cor[num_individuos+1]; for( u = 1; u <= num_individuos; u++ ) cor[u] = -1;
    134. 134. Aplicações: Bicoloraçãowhile( num_relacoes-- ){ cin >> u >> v; grafo[u].push_back( v ); grafo[v].push_back( u );}bool bipartido = true;for( int i = 1; i <= num_individuos && bipartido; i++ ){ if( cor[i] != -1 ) continue; cor[i] = 1; list< int > fila; fila.push_back( i );
    135. 135. Aplicações: Bicoloração while( !fila.empty() && bipartido ){ u = fila.front(); fila.pop_front(); for( w = grafo[u].begin(); w != grafo[u].end(); w++ ){ if( cor[*w] == -1 ){ cor[*w] = 1-cor[u]; // pinta o vizinho da cor contraria fila.push_back( *w ); // e adiciona na fila } else if( cor[*w] != 1-cor[*w] ) { // O vizinho estava pintado da mesma cor, grafo nao e // bicolorivel. bipartido = false; break; } }}
    136. 136. Aplicações: Bicoloração } if( bipartido ) cout << “Possivel distinguir os sexosn”; else cout << “Existem individuos suspeitos no grupon”; return 0;}
    137. 137. Aplicações: Detecção de Ciclos• Sabemos que existem grafos cíclicos e acíclicos.• Mas dado um grafo, como seria uma algoritmo que verifica se ele é cíclico ou acíclico ?
    138. 138. Aplicações: Detecção de Ciclos• Durante um DFS, podemos classificar as arestas do grafo em 3 tipos, são eles: • arestas descendentes - ligam ancestrais a descendentes • arestas de retorno - ligam descendentes a ancestrais • arestas cruzadas - ligam vértices sem relação ancestral/descendente
    139. 139. Aplicações:Detecção de Ciclos• Um grafo tem um ciclo, se e somente se ele possui uma aresta de retorno.• Portanto, se durante uma busca em profundidade detectarmos tal tipo de aresta, podemos garantir que o grafo é cíclico.
    140. 140. Aplicações:Detecção de Ciclos• A idéia apesar de muito parecida funciona de maneiras diferentes para grafos orientados e não orientados.• No grafo não orientado, inicialmente todos estão pintados de branco, e a medida que são descobertos são pintados de preto.
    141. 141. Aplicações:Detecção de Ciclos• Quando um vértice tem uma aresta para um vértice pintado de preto ( que já foi descoberto ), e esse não é seu pai, essa é uma aresta de retorno.• Logo, o grafo tem um ciclo.
    142. 142. Aplicações:Detecção de Ciclos• Nos grafos orientados, o fato de um vizinho já ter sido descoberto não significa que a aresta é de retorno;• Isso só é verdade se o vértice ainda estiver sendo processado..• Portanto, precisamos diferenciar entre ‘não- usado’, ‘descoberto’ e ‘processado’
    143. 143. Aplicações:Detecção de Ciclos• Num grafo direcionado uma aresta de retorno é uma aresta que aponta para um vértice ‘descoberto’.• Então.. vamos ao código !
    144. 144. Aplicações: Detecção de Ciclosbool ciclico(){ for( int u = 1; u <= num_vert; u++ ) cor[u] = -1; for( int u = 1; u <= num_vert; u++ ) if( cor[u] == -1 ){ parent[u] = u; // necessario para grafos nao orientados if( dfsC( u ) ) return true; } return false;}
    145. 145. Aplicações: Detecção de Ciclosbool dfsC( int u ){ // versao para grafos nao orientados cor[u] = 1; for( list<int>::iterator v = grafo[u].beging(); v != grafo[u].end(); v++ ){ if( cor[*v] == -1 ){ parent[*v] = u; if( dfsC( *v ) ) return true; } else if( *v != parent[u] ) return true; } return false;}
    146. 146. Aplicações: Detecção de Ciclosbool dfsC( int u ){ // versao para grafos orientados cor[u] = 1; // vertice u foi descoberto for( list<int>::iterator v = grafo[u].beging(); v != grafo[u].end(); v++ ){ if( cor[*v] == -1 ){ if( dfsC( *v ) ) return true; } else if( cor[*v] == 1 ) return true; } cor[u] = 2; // vertice u foi processado return false;}
    147. 147. Aplicações:Ordenação Topológica• No curso de Ciência da Computação algumas disciplinas possuem pré-requisitos.• Dadas as disciplinas que o aluno deve cursar e seus pré-requisitos como descobrir em qual ordem as matérias podem ser cursadas ?
    148. 148. Aplicações:Ordenação Topológica• As disciplinas podem ser vistas como os vértices de um grafo;• Existe uma aresta direcionada do vértice X para o vértice Y se a disciplina X é pré- requisito da disciplina Y.
    149. 149. Aplicações:Ordenação Topológica• Uma ordenação topológica ordena os vértices em uma linha de modo que as arestas são todas direcionadas da esquerda pra direita.• Logicamente, se o grafo é cíclico é impossível que tal ordenação exista.
    150. 150. Aplicações:Ordenação Topológica• Mas como fazer uma ordenação topológica ? • Simples! Basta uma busca em profundidade para gerar uma ordenação topológica, ou retornar um erro caso o grafo seja cíclico.• Como assim ?
    151. 151. Aplicações:Ordenação Topológica• Na busca em profundidade depois que analisamos todas as arestas que saem de um vértice, podemos garantir que ele não tem nenhuma aresta de entrada vindo de um vértice que já foi processado.• E se em algum momento detectamos a existência de um ciclo ? • Uma ordenação topológica não existe.
    152. 152. Aplicações: Ordenação Topológicabool gera_ordenacao(){ ordem.clear(); // pilha onde a ordenacao sera armazenada for( int u = 1; u <= num_vert; u++ ) cor[u] = -1; for( int u = 1; u <= num_vert; u++ ) if( cor[u] == -1 ){ if( dfsT( u ) ) return false; } while( !ordem.empty() ){ int u = ordem.top(); ordem.pop(); cout << u << “ “; } return true;}
    153. 153. Aplicações: Ordenação Topológicabool dfsT( int u ){ cor[u] = 1; // vertice u foi descoberto for( list<int>::iterator v = grafo[u].beging(); v != grafo[u].end(); v++ ){ if( cor[*v] == -1 ){ if( dfsC( *v ) ) return true; } else if( cor[*v] == 1 ) return true; } cor[u] = 2; // vertice u foi processado pilha.push( u ); return false;}
    154. 154. Aplicações: Caminhos Mínimos• Num grafo não ponderado, quando queremos encontrar o menor caminho do vértice s ao vértice t, precisamos apenas de uma busca em largura.
    155. 155. Aplicações: Caminhos Mínimos• Por que ? • Se as arestas não tem pesos diferentes, o custo do menor caminho de s para t é na verdade, a menor profundidade, partindo de s com que conseguimos visitar t.
    156. 156. Aplicações: Caminhos Mínimos• Dado o funcionamento da busca em largura, isso é exatamente o que ela calcula.• Primeiro todos os vértices a profundidade 1 são visitados, em seguida todos que estão a profundidade 2 e assim por diante.
    157. 157. Aplicações: Caminhos Mínimosint menorCaminho( int s, int t ){ int dist[num_vert]; memset( dist, -1, sizeof( dist ) ); dist[s] = 0; ... return dist[t];}
    158. 158. continua..
    159. 159. Referências e bibliografia• [TADM] - Steven S. Skiena -The Algorithm Design Manual• Thomas H. Cormen, Charles E. Leiserson - Introduction to Algorithms, Second Edition 66

    ×