Cod sursa(job #2197007)

Utilizator georgeromanGeorge Roman georgeroman Data 20 aprilie 2018 21:13:35
Problema Parcurgere DFS - componente conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <stack>
#include <vector>
#include <iostream>

int main() {
  std::ifstream in("dfs.in");
  std::ofstream out("dfs.out");

  unsigned n, m;
  in >> n >> m;

  std::vector<std::vector<unsigned>> graph = std::vector<std::vector<unsigned>>();
  graph.reserve(n);
  for (unsigned i = 0; i < n; i++) graph.push_back(std::vector<unsigned>());

  for (unsigned i = 0; i < m; i++) {
    unsigned v1, v2;
    in >> v1 >> v2;
    graph[v1 - 1].push_back(v2);
    graph[v2 - 1].push_back(v1);
  }

  unsigned numComponents = 0;

  std::vector<bool> visited = std::vector<bool>();
  visited.reserve(n);
  for (unsigned i = 0; i < n; i++) visited.push_back(false);
  unsigned currentUnvisited = 1;

  unsigned numVisited = 0;
  std::stack<unsigned> s;

  while (numVisited < n) {
    s.push(currentUnvisited);
    visited[currentUnvisited - 1] = true;
    do {
      currentUnvisited++;
    } while (visited[currentUnvisited - 1] && currentUnvisited < n);
    numVisited++;
    while (!s.empty()) {
      unsigned current = s.top();
      bool hasNeighbors = false;
      for (unsigned v : graph[current - 1]) {
        if (!visited[v - 1]) {
          if (v == currentUnvisited) {
            do {
              currentUnvisited++;
            } while (visited[currentUnvisited - 1] && currentUnvisited < n);
          }
          hasNeighbors = true;
          s.push(v);
          visited[v - 1] = true;
          numVisited++;
          break;
        }
      }
      if (!hasNeighbors) s.pop();
    }

    numComponents++;
  }

  out << numComponents;
  return 0;
}