SlideShare uma empresa Scribd logo
1 de 159
TREINAMENTO PARA
 COMPETIÇÕES DE
 PROGRAMAÇÃO
GRAFOS PARTE 1
                   TAP
             TURMA INICIANTE




Murilo Adriano Vasconcelos e Paulo Cezar P. Costa - INF/UFG
                                http://murilo.wordpress.com



                  1
Grafos: Introdução




        2
Grafos

• O que é um grafo?
• Tipos de grafos
• Representações de grafos
• Algoritmos de busca
• Aplicações dos algoritmos de busca
                    3
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
O que é um grafo?

Matematicamente denotado como:
G = (V, E), onde V é o conjunto de vértices
e E o conjunto de arestas (edges) formado
por pares ordenados ou não de vértices do
conjunto V.



                    5
Tipos de grafos

• Direcionados / Não-direcionados
• Ponderados / Não-ponderados
• Cíclicos / Acíclicos
• Esparsos / Densos

                    6
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
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
Grafos Não-Direcionados / Direcionados




    Não-direcionado       Direcionado

                                 *Figuras retiradas de [TADM] p.147




                      9
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
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
Grafos Não-Ponderados / Ponderados




   Não-ponderado        Ponderado

                              *Figuras retiradas de [TADM] p.147




                   12
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
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
Grafos Acíclicos / Cíclicos




Acíclico            Cíclico

                         *Figuras retiradas de [TADM] p.147




            15
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
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
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
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
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
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
Representações de grafos:
         Comparativo
        Comparação                                  Vencedor
Checar se (u, v) pertence ao grafo                  matrizes de adjacência O(1)
Checar o grau de um vértice                                   listas de ajacência

Memória em grafos pequenos                     listas de adjacência (n + m) vs n2

Inserçã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ência

Melhor para a maioria dos problemas                           listas de ajacência
                                                                  *Sugerido por [TADM] p.152




                                      22
Implementação: Matrizes de adjacência

// Declarando
const int MAX_VERTICES = 100;
tipo grafo[MAX_VERTICES][MAX_VERTICES];

// Inicializando
for (int i = 0; i < num_arestas; ++i)
    for (int j = i; j < num_arestas; ++j)
        grafo[i][j] = grafo[j][i] = 0;

// Populando
int 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
Implementação: Listas de adjacência
#include <list> // std::list
#include <utility> // pair<> e make_pair()
using namespace std;

// Declarando
const int MAX_VERTICES = 100;
list< pair<tipo, int> > grafo[MAX_VERTICES];

// Inicializando
for (int i = 0; i < num_arestas; ++i)
        grafo[i].clear();

// Populando
int 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
Algoritmos de busca em grafos



• Dois principais:
 • Busca em largura (ou Breadth-First Search
    - BFS)

 • Busca em profundidade (ou Depth-First
    Search - DFS)




                     25
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Algoritmos de busca em grafos - Busca em largura


 • Expande todos os vizinhos de um vértice
    primeiro:




                       26
Implementação: Busca em largura

#include <list> // std::list
#include <utility> // pair<> e make_pair()
using namespace std;

// Declarando
const 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
Implementação: Busca em largura
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;
    // 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
Algoritmos de busca em grafos - Busca em largura




               3
                            5
               2                 4
 0
                            6
               1



                       29
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
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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em largura

FILA: 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
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Algoritmos de busca em grafos - Busca em
                profundidade

• Explora primeiro o último vértice
  colocado na lista (funciona como uma
  pilha):




                     30
Implementação: Busca em profundidade



// Declarando
const 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 atual
void dfs(int atual) {
    for (int i = 0; i < num_vertices; ++i) {
        if (grafo[atual][i] && !visitado[i]) {
            visitado[i] = true;
            dfs(i);
        }
    }
}




                          31
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
  ponderados)
• Conectividade
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.
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.
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 ?
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 ?
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.
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.
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;
Aplicações:
             Bicoloração
while( 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 );
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;
     }
  }
}
Aplicações:
                    Bicoloração
    }

    if( bipartido ) cout << “Possivel distinguir os sexosn”;
    else cout << “Existem individuos suspeitos no grupon”;

    return 0;
}
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 ?
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
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.
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.
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.
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’
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 !
Aplicações:
       Detecção de Ciclos
bool 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;
}
Aplicações:
        Detecção de Ciclos
bool 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;
}
Aplicações:
        Detecção de Ciclos
bool 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;
}
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 ?
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.
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.
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 ?
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.
Aplicações:
      Ordenação Topológica
bool 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;
}
Aplicações:
    Ordenação Topológica
bool 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;
}
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.
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.
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.
Aplicações:
          Caminhos Mínimos
int menorCaminho( int s, int t ){

    int dist[num_vert];
    memset( dist, -1, sizeof( dist ) );
    dist[s] = 0;

    ...

    return dist[t];
}
continua..
Referências e bibliografia



•   [TADM] - Steven S. Skiena -The Algorithm Design Manual

•   Thomas H. Cormen, Charles E. Leiserson - Introduction to Algorithms, Second
    Edition




                                     66

Mais conteúdo relacionado

Mais procurados

Tutorial Django + Python
Tutorial Django + PythonTutorial Django + Python
Tutorial Django + Python
Mateus Padua
 
Estrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores BináriasEstrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores Binárias
Adriano Teixeira de Souza
 

Mais procurados (20)

Estrutura de dados - Árvores Binárias
Estrutura de dados - Árvores BináriasEstrutura de dados - Árvores Binárias
Estrutura de dados - Árvores Binárias
 
Aulas 11-guloso Algoritmos
Aulas 11-guloso AlgoritmosAulas 11-guloso Algoritmos
Aulas 11-guloso Algoritmos
 
Árvore B estruturas de dados e técnicas de programação
Árvore B estruturas de dados e técnicas de programaçãoÁrvore B estruturas de dados e técnicas de programação
Árvore B estruturas de dados e técnicas de programação
 
Análise de Algoritmos - Conceitos de Grafos
Análise de Algoritmos - Conceitos de GrafosAnálise de Algoritmos - Conceitos de Grafos
Análise de Algoritmos - Conceitos de Grafos
 
Estruturas de Dados - Listas Encadeadas (Linked List)
Estruturas de Dados - Listas Encadeadas (Linked List)Estruturas de Dados - Listas Encadeadas (Linked List)
Estruturas de Dados - Listas Encadeadas (Linked List)
 
Grafos e Árvores
Grafos e ÁrvoresGrafos e Árvores
Grafos e Árvores
 
Introdução a Web Services
Introdução a Web ServicesIntrodução a Web Services
Introdução a Web Services
 
Tutorial Django + Python
Tutorial Django + PythonTutorial Django + Python
Tutorial Django + Python
 
Estrutura de Dados - Grafos
Estrutura de Dados - GrafosEstrutura de Dados - Grafos
Estrutura de Dados - Grafos
 
JAVA - Orientação a Objetos
JAVA - Orientação a ObjetosJAVA - Orientação a Objetos
JAVA - Orientação a Objetos
 
Exercícios - Herança - Java
Exercícios - Herança - JavaExercícios - Herança - Java
Exercícios - Herança - Java
 
Aula 6 - Constantes e variáveis
Aula 6 - Constantes e variáveisAula 6 - Constantes e variáveis
Aula 6 - Constantes e variáveis
 
Aula04 - cabeamento estruturado - parte 01
Aula04 - cabeamento estruturado - parte 01Aula04 - cabeamento estruturado - parte 01
Aula04 - cabeamento estruturado - parte 01
 
Banco de dados distribuídos mnt bd
Banco de dados distribuídos mnt bdBanco de dados distribuídos mnt bd
Banco de dados distribuídos mnt bd
 
Estrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas EncadeadasEstrutura de Dados - Listas Encadeadas
Estrutura de Dados - Listas Encadeadas
 
Expressões regulares, grep e sed - Bóson Treinamentos
Expressões regulares, grep e sed - Bóson TreinamentosExpressões regulares, grep e sed - Bóson Treinamentos
Expressões regulares, grep e sed - Bóson Treinamentos
 
Html Exercicio
Html ExercicioHtml Exercicio
Html Exercicio
 
Estrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores BináriasEstrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores Binárias
 
Sistema de gerenciamento de banco de dados
Sistema de gerenciamento de banco de dadosSistema de gerenciamento de banco de dados
Sistema de gerenciamento de banco de dados
 
Grafos
GrafosGrafos
Grafos
 

Destaque

Introdução à Teoria dos Grafos
Introdução à Teoria dos GrafosIntrodução à Teoria dos Grafos
Introdução à Teoria dos Grafos
Bianca Dantas
 

Destaque (14)

Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...
Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...
Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...
 
Teoria dos Grafos
Teoria dos GrafosTeoria dos Grafos
Teoria dos Grafos
 
Tópicos Avan
Tópicos AvanTópicos Avan
Tópicos Avan
 
Treinamento para Competições de Programacão - Single-Source Shortest Paths: D...
Treinamento para Competições de Programacão - Single-Source Shortest Paths: D...Treinamento para Competições de Programacão - Single-Source Shortest Paths: D...
Treinamento para Competições de Programacão - Single-Source Shortest Paths: D...
 
Tópicos Avançados em Computabilidade - Teorema da Recursão e Decibilidade de ...
Tópicos Avançados em Computabilidade - Teorema da Recursão e Decibilidade de ...Tópicos Avançados em Computabilidade - Teorema da Recursão e Decibilidade de ...
Tópicos Avançados em Computabilidade - Teorema da Recursão e Decibilidade de ...
 
Treinamento Para Competições de Programação - All Pairs Shortest Paths - O Al...
Treinamento Para Competições de Programação - All Pairs Shortest Paths - O Al...Treinamento Para Competições de Programação - All Pairs Shortest Paths - O Al...
Treinamento Para Competições de Programação - All Pairs Shortest Paths - O Al...
 
Design Patterns - Adapter e Decorator
Design Patterns - Adapter e DecoratorDesign Patterns - Adapter e Decorator
Design Patterns - Adapter e Decorator
 
Introdução ao Processamento de Imagens Digitais
Introdução ao Processamento de Imagens DigitaisIntrodução ao Processamento de Imagens Digitais
Introdução ao Processamento de Imagens Digitais
 
Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...
Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...
Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...
 
SERIE BENCÉNICA I
SERIE BENCÉNICA ISERIE BENCÉNICA I
SERIE BENCÉNICA I
 
Introdução à Teoria dos Grafos
Introdução à Teoria dos GrafosIntrodução à Teoria dos Grafos
Introdução à Teoria dos Grafos
 
Arenos y aromaticidad
Arenos y aromaticidadArenos y aromaticidad
Arenos y aromaticidad
 
Introdução à Teoria dos Grafos e Análise de Redes Sociais
Introdução à Teoria dos Grafos e Análise de Redes SociaisIntrodução à Teoria dos Grafos e Análise de Redes Sociais
Introdução à Teoria dos Grafos e Análise de Redes Sociais
 
Quimica organica
Quimica organicaQuimica organica
Quimica organica
 

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

Pesquisa operacional teoria dos grafos
Pesquisa operacional teoria dos grafosPesquisa operacional teoria dos grafos
Pesquisa operacional teoria dos grafos
Diego Henrique
 
Teoria de Grafos.ppt.pptx para estudar MACS
Teoria de Grafos.ppt.pptx para estudar MACSTeoria de Grafos.ppt.pptx para estudar MACS
Teoria de Grafos.ppt.pptx para estudar MACS
sandra soares
 
Apresentação geometria analítica
Apresentação geometria analíticaApresentação geometria analítica
Apresentação geometria analítica
profluizgustavo
 
Resumo do 7º,8º e 9º anos para t.i
Resumo do 7º,8º e 9º anos para t.iResumo do 7º,8º e 9º anos para t.i
Resumo do 7º,8º e 9º anos para t.i
Shivani Himatlal
 

Semelhante a Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Turma Iniciantes (20)

Seminário sobre Grafos por Samyra Lara
Seminário sobre Grafos por Samyra LaraSeminário sobre Grafos por Samyra Lara
Seminário sobre Grafos por Samyra Lara
 
Introdução aos grafos: Principais conceitos
Introdução aos grafos: Principais conceitosIntrodução aos grafos: Principais conceitos
Introdução aos grafos: Principais conceitos
 
Grafos_1.pptx
Grafos_1.pptxGrafos_1.pptx
Grafos_1.pptx
 
Apresentação ia
Apresentação iaApresentação ia
Apresentação ia
 
Pesquisa operacional teoria dos grafos
Pesquisa operacional teoria dos grafosPesquisa operacional teoria dos grafos
Pesquisa operacional teoria dos grafos
 
Grafosv2
Grafosv2Grafosv2
Grafosv2
 
slidesWtisc(1).pptx
slidesWtisc(1).pptxslidesWtisc(1).pptx
slidesWtisc(1).pptx
 
Árvores Espalhadas Mínimas
Árvores Espalhadas MínimasÁrvores Espalhadas Mínimas
Árvores Espalhadas Mínimas
 
ARS - Análise de Redes Sociais - VIII ERI MG
ARS - Análise de Redes Sociais - VIII ERI MGARS - Análise de Redes Sociais - VIII ERI MG
ARS - Análise de Redes Sociais - VIII ERI MG
 
Teoria de Grafos.ppt.pptx para estudar MACS
Teoria de Grafos.ppt.pptx para estudar MACSTeoria de Grafos.ppt.pptx para estudar MACS
Teoria de Grafos.ppt.pptx para estudar MACS
 
Grafos
GrafosGrafos
Grafos
 
Topological Sorting (Portuguese)
Topological Sorting (Portuguese)Topological Sorting (Portuguese)
Topological Sorting (Portuguese)
 
Introdução a Teoria dos Grafos
Introdução a Teoria dos GrafosIntrodução a Teoria dos Grafos
Introdução a Teoria dos Grafos
 
Algoritmo de Kosaraju
Algoritmo de KosarajuAlgoritmo de Kosaraju
Algoritmo de Kosaraju
 
Elementary Circuits Enumeration in Graphs
Elementary Circuits Enumeration in GraphsElementary Circuits Enumeration in Graphs
Elementary Circuits Enumeration in Graphs
 
Apresentação geometria analítica
Apresentação geometria analíticaApresentação geometria analítica
Apresentação geometria analítica
 
Resumo do 7º,8º e 9º anos para t.i
Resumo do 7º,8º e 9º anos para t.iResumo do 7º,8º e 9º anos para t.i
Resumo do 7º,8º e 9º anos para t.i
 
MACS - grafos, trajetos e circuitos eulerianos; circuitos eulerianos...
MACS - grafos, trajetos e circuitos eulerianos; circuitos eulerianos...MACS - grafos, trajetos e circuitos eulerianos; circuitos eulerianos...
MACS - grafos, trajetos e circuitos eulerianos; circuitos eulerianos...
 
Aula 06
Aula 06Aula 06
Aula 06
 
Resolução - P2 - Modelo A - Geometria Analítica
Resolução - P2 - Modelo A - Geometria AnalíticaResolução - P2 - Modelo A - Geometria Analítica
Resolução - P2 - Modelo A - Geometria Analítica
 

Último

PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
HELENO FAVACHO
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf
marlene54545
 
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdfGEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
RavenaSales1
 
Slide - EBD ADEB 2024 Licao 02 2Trim.pptx
Slide - EBD ADEB 2024 Licao 02 2Trim.pptxSlide - EBD ADEB 2024 Licao 02 2Trim.pptx
Slide - EBD ADEB 2024 Licao 02 2Trim.pptx
edelon1
 
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
LeloIurk1
 
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptxResponde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
AntonioVieira539017
 
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
LeloIurk1
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
TailsonSantos1
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividades
FabianeMartins35
 

Último (20)

PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
 
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxSlides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf
 
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdfRecomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
 
Slides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptx
Slides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptxSlides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptx
Slides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptx
 
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdfPROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
 
praticas experimentais 1 ano ensino médio
praticas experimentais 1 ano ensino médiopraticas experimentais 1 ano ensino médio
praticas experimentais 1 ano ensino médio
 
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
 
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdfGEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
 
Slide - EBD ADEB 2024 Licao 02 2Trim.pptx
Slide - EBD ADEB 2024 Licao 02 2Trim.pptxSlide - EBD ADEB 2024 Licao 02 2Trim.pptx
Slide - EBD ADEB 2024 Licao 02 2Trim.pptx
 
aula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptaula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.ppt
 
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
 
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptxResponde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
 
Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!
 
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdfPROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
 
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
 
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcanteCOMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividades
 
Análise poema país de abril (Mauel alegre)
Análise poema país de abril (Mauel alegre)Análise poema país de abril (Mauel alegre)
Análise poema país de abril (Mauel alegre)
 

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

  • 1. TREINAMENTO PARA COMPETIÇÕES DE PROGRAMAÇÃO GRAFOS PARTE 1 TAP TURMA INICIANTE Murilo Adriano Vasconcelos e Paulo Cezar P. Costa - INF/UFG http://murilo.wordpress.com 1
  • 3. Grafos • O que é um grafo? • Tipos de grafos • Representações de grafos • Algoritmos de busca • Aplicações dos algoritmos de busca 3
  • 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. O que é um grafo? Matematicamente denotado como: G = (V, E), onde V é o conjunto de vértices e E o conjunto de arestas (edges) formado por pares ordenados ou não de vértices do conjunto V. 5
  • 6. Tipos de grafos • Direcionados / Não-direcionados • Ponderados / Não-ponderados • Cíclicos / Acíclicos • Esparsos / Densos 6
  • 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. 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. Grafos Não-Direcionados / Direcionados Não-direcionado Direcionado *Figuras retiradas de [TADM] p.147 9
  • 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. 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. Grafos Não-Ponderados / Ponderados Não-ponderado Ponderado *Figuras retiradas de [TADM] p.147 12
  • 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. 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. Grafos Acíclicos / Cíclicos Acíclico Cíclico *Figuras retiradas de [TADM] p.147 15
  • 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. 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. 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. 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. 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. 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. Representações de grafos: Comparativo Comparação Vencedor Checar se (u, v) pertence ao grafo matrizes de adjacência O(1) Checar o grau de um vértice listas de ajacência Memória em grafos pequenos listas de adjacência (n + m) vs n2 Inserçã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ência Melhor para a maioria dos problemas listas de ajacência *Sugerido por [TADM] p.152 22
  • 23. Implementação: Matrizes de adjacência // Declarando const int MAX_VERTICES = 100; tipo grafo[MAX_VERTICES][MAX_VERTICES]; // Inicializando for (int i = 0; i < num_arestas; ++i) for (int j = i; j < num_arestas; ++j) grafo[i][j] = grafo[j][i] = 0; // Populando int 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. Implementação: Listas de adjacência #include <list> // std::list #include <utility> // pair<> e make_pair() using namespace std; // Declarando const int MAX_VERTICES = 100; list< pair<tipo, int> > grafo[MAX_VERTICES]; // Inicializando for (int i = 0; i < num_arestas; ++i) grafo[i].clear(); // Populando int 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. 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. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 27. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 28. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 29. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 30. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 31. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 32. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 33. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 34. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 35. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 36. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 37. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 38. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 39. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 40. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 41. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 42. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 43. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 44. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 45. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 46. Algoritmos de busca em grafos - Busca em largura • Expande todos os vizinhos de um vértice primeiro: 26
  • 47. Implementação: Busca em largura #include <list> // std::list #include <utility> // pair<> e make_pair() using namespace std; // Declarando const 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. Implementação: Busca em largura 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; // 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. Algoritmos de busca em grafos - Busca em largura 3 5 2 4 0 6 1 29
  • 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. 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em largura FILA: 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. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 93. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 94. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 95. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 96. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 97. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 98. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 99. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 100. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 101. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 102. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 103. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 104. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 105. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 106. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 107. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 108. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 109. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 110. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 111. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 112. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 113. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 114. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 115. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 116. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 117. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 118. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 119. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 120. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 121. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 122. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 123. Algoritmos de busca em grafos - Busca em profundidade • Explora primeiro o último vértice colocado na lista (funciona como uma pilha): 30
  • 124. Implementação: Busca em profundidade // Declarando const 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 atual void dfs(int atual) { for (int i = 0; i < num_vertices; ++i) { if (grafo[atual][i] && !visitado[i]) { visitado[i] = true; dfs(i); } } } 31
  • 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. 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. 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. 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. 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. 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. 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. 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. Aplicações: Bicoloração while( 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. 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. Aplicações: Bicoloração } if( bipartido ) cout << “Possivel distinguir os sexosn”; else cout << “Existem individuos suspeitos no grupon”; return 0; }
  • 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. 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. 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. 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. 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. 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. 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. Aplicações: Detecção de Ciclos bool 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. Aplicações: Detecção de Ciclos bool 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. Aplicações: Detecção de Ciclos bool 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. 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. 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. 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. 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. 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. Aplicações: Ordenação Topológica bool 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. Aplicações: Ordenação Topológica bool 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. 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. 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. 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. Aplicações: Caminhos Mínimos int menorCaminho( int s, int t ){ int dist[num_vert]; memset( dist, -1, sizeof( dist ) ); dist[s] = 0; ... return dist[t]; }
  • 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

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n
  138. \n
  139. \n
  140. \n
  141. \n
  142. \n
  143. \n
  144. \n
  145. \n
  146. \n
  147. \n
  148. \n
  149. \n
  150. \n
  151. \n
  152. \n
  153. \n
  154. \n
  155. \n
  156. \n