Pagini recente » Cod sursa (job #2739563) | Cod sursa (job #389456) | Cod sursa (job #2627128) | Cod sursa (job #2870391) | Cod sursa (job #2765633)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("ctc.in");
ofstream cout("ctc.out");
#define DIM 100001
vector<int> v[DIM], ctc[DIM], a[DIM], S;
int sel[DIM], n, m, x, y, nrcomp;
static inline void dfs(int k) {
sel[k] = 1; ///marchez nodul ca vizitat;
for(auto e : v[k])
if(!sel[e])
dfs(e);
S.push_back(k);
}
static inline void dfsGT(int k) {
sel[k] = 1;
ctc[nrcomp].push_back(k);
for(auto e : a[k])
if(!sel[e])
dfsGT(e);
}
static inline void Kosaraju() {
for(int i = 1; i <= n; i++)
if(!sel[i])
dfs(i);
for(int i = 1; i <= n; i++)
sel[i] = 0;
for(int i = S.size() - 1; i >= 0; i--)
if(!sel[S[i]]) {
nrcomp++;
dfsGT(S[i]);
}
}
int main() {
cin >> n >> m;
for(int i = 1; i <= m; i++) {
cin >> x >> y;
v[x].push_back(y);
a[y].push_back(x); ///pentru graful transpus;
}
Kosaraju();
for(int i = 1; i <= nrcomp; i++) {
for(auto nod : ctc[i])
cout << nod << " ";
cout << '\n';
}
return 0;
}