Pagini recente » Cod sursa (job #372865) | Cod sursa (job #2831463) | Cod sursa (job #2469422) | Cod sursa (job #640029) | Cod sursa (job #3178954)
#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";
}
}