Cod sursa(job #3178954)

Utilizator David8406Marian David David8406 Data 2 decembrie 2023 19:30:01
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <climits>
#include <set>
#include <string>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
vector <int> v[100005], v_transpus[100005], componente[100005];
bool viz[100005];
int parcurgere_nod[100005], k, comp_conx[100005], nrc;
void dfs_plus(int nod) {
	viz[nod] = 1;
	for (auto el : v[nod]) {
		if (!viz[el]) dfs_plus(el);
	}
	parcurgere_nod[++k] = nod;
}
void dfs_minus(int nod, int comp) {
	comp_conx[nod] = comp;
	for (auto el : v_transpus[nod]) {
		if (comp_conx[el] == 0) dfs_minus(el, comp);
	}
}
int main() {
	int n, m;
	fin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int x, y;
		fin >> x >> y;
		v[x].push_back(y);
		v_transpus[y].push_back(x);
	}
	for (int i = 1; i <= n; i++) {
		if (!viz[i]) {
			dfs_plus(i);
		}
	}
	for (int i = k; i >= 1; i--) {
		if (comp_conx[parcurgere_nod[i]] == 0) {
			nrc++;
			dfs_minus(parcurgere_nod[i], nrc);
		}
	}
	for (int i = 1; i <= n; i++) {
		componente[comp_conx[i]].push_back(i);
	}
	fout << nrc << "\n";
	for (int i = 1; i <= nrc; i++) {
		for (auto el : componente[i]) fout << el << " ";
		fout << "\n";
	}
}