Cod sursa(job #2758803)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 13 iunie 2021 00:02:21
Problema Componente biconexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>
#include <vector>
#include <stack>

using namespace std;
int N, M;
vector<vector<int>> Graph, Comps;
vector<bool> used;
vector<int> depth;
vector<int> level;
stack<pair<int,int>> Stack;

void getComponent(int k, int v)
{
  vector<int> component;
  while (!Stack.empty()) {
    auto crt = Stack.top();
    Stack.pop();
    component.emplace_back(crt.second);
    if (crt.first == k)
      break;
  }
  component.emplace_back(k);
  Comps.emplace_back(component);
}

void DFS(int dad, int k) {
  used[k] = true;
  depth[k] = depth[dad] + 1;
  level[k] = depth[k];

  for (auto v: Graph[k])
    if (!used[v]) {
      Stack.emplace(k, v);
      DFS(k, v);
      level[k] = min(level[k], level[v]);
      if (level[v] >= depth[k])
	getComponent(k, v);
    }
    else
      if (v != dad)
	level[k] = min(level[k], depth[v]);
}


int main()
{
  freopen("biconex.in", "r", stdin);
  freopen("biconex.out", "w", stdout);

  scanf("%d%d", &N, &M);

  Graph.resize(N + 1);
  used.resize(N + 1);
  depth.resize(N + 1);
  level.resize(N + 1);

  int from, to;

  for (int i = 0; i < M; ++i) {
    scanf("%d%d", &from, &to);
    Graph[from].emplace_back(to);
    Graph[to].emplace_back(from);
  }

  for (int i = 1; i <= N; ++i)
    if (!used[i]) {
      Stack.emplace(0, i);
      DFS(0, i);
      Stack.pop();
    }

  printf("%d\n", (int)Comps.size());
  for (auto comp: Comps) {
    for (auto v: comp)
      printf("%d ", v);
    printf("\n");
  }
  
  return 0;
}