Advertisement
Lucas_Napon

L5Q2

Apr 21st, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. // Grafos - Lista de adjacência
  2.  
  3. #include <iostream>
  4. #include <list>
  5. #include <queue>
  6.  
  7. using namespace std;
  8.  
  9. const int tamanho_maximo = 1000;
  10.  
  11. bool visitados[tamanho_maximo];
  12. int contador;
  13.  
  14. class Grafo {
  15.     int V; // número de vértices
  16.     list<int> *adj; // ponteiro para um array contendo as listas de adjacências
  17.  
  18. public:
  19.     Grafo(int V) {
  20.         this->V = V; // atribui o número de vértices
  21.         adj = new list<int>[V]; // cria as listas
  22.     }
  23.  
  24.     void adicionarAresta(int v1, int v2) {
  25.         // adiciona vértice v2 à lista de vértices adjacentes de v1
  26.         adj[v1].push_back(v2);
  27.         adj[v2].push_back(v1);
  28.     }
  29.  
  30.     void resetar_visitados() {
  31.         for(int i = 0; i < V; i++)
  32.             visitados[i] = false;
  33.     }
  34.  
  35.     void bfs(int v) {
  36.         queue<int> fila;
  37.  
  38.         visitados[v] = true; // marca como visitado
  39.  
  40.         while(true) {
  41.             list<int>::iterator it;
  42.             for(it = adj[v].begin(); it != adj[v].end(); it++) {
  43.                 if(!visitados[*it]) {
  44.                     visitados[*it] = true; // marca como visitado
  45.                     fila.push(*it); // insere na fila
  46.                 }
  47.             }
  48.             // verifica se a fila NÃO está vazia
  49.             if (!fila.empty()) {
  50.                 v = fila.front(); // obtém o primeiro elemento
  51.                 fila.pop(); // remove da fila
  52.             } else {
  53.                 return;
  54.             }
  55.         }
  56.     }
  57. };
  58.  
  59.  
  60. int main() {
  61.     int quantidade;
  62.     cin >> quantidade;
  63.     for (int i = 0; i < quantidade; i++) {
  64.         char vertices;
  65.         cin >> vertices;
  66.         int vertices2 = vertices - 'A' + 1;
  67.         Grafo grafo(vertices2);
  68.         int v1, v2;
  69.         string arestabranco;
  70.         getline(cin,arestabranco);
  71.         do {
  72.             string aresta;
  73.             getline(cin,aresta);
  74.             if (aresta == "")
  75.                 break;
  76.             v1 = aresta[0] - 'A';
  77.             v2 = aresta[1] - 'A';
  78.             grafo.adicionarAresta(v1, v2);
  79.         } while (true);
  80.         grafo.resetar_visitados();
  81.         for (int j = 0; j < vertices2 ; j++) {
  82.             if (visitados[j] == false){
  83.                 contador+=1;
  84.                 grafo.bfs(j);
  85.             }
  86.         }
  87.         if(i==quantidade-1){
  88.             cout << contador;
  89.             contador = 0;
  90.         } else {
  91.             cout << contador << endl;
  92.             contador = 0;
  93.         }
  94.  
  95.  
  96.     }
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement