Pagini recente » Cod sursa (job #2967344) | Cod sursa (job #1422887) | Cod sursa (job #1099988) | Cod sursa (job #917227) | Cod sursa (job #2981061)
#include <fstream>
#include <iostream>
#include <vector>
#include <stack>
#include <set>
#include <unordered_map>
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
#define N 1000001
int n, m, id = 1, sccCnt = 0;
vector<int> a[N];
int ids[N], low[N], onStack[N];
stack<int> s;
void dfs(int x){
s.push(x);
onStack[x] = true;
ids[x] = low[x] = id++;
for(int k : a[x]){
if(ids[k] == 0)
dfs(k);
if(onStack[k])
low[x] = min(low[x], low[k]);
}
if(ids[x] == low[x]){
while(s.empty() == false){
int node = s.top();
s.pop();
onStack[node] = false;
low[node] = ids[x];
if(node == x) break;
}
sccCnt++;
}
}
void findSCCs(){
for(int i=1; i<=n; i++){
if(ids[i] == 0)
dfs(i);
}
out << sccCnt << '\n';
set<int> keys;
unordered_map<int, set<int>> m;
for(int i=1; i<=n; i++){
keys.insert(low[i]);
m[low[i]].insert(i);
}
for(int i : keys){
for(int k : m[i])
out << k << ' ';
out << '\n';
}
}
int main(){
in >> n >> m;
while(m--){
int x, y;
in >> x >> y;
a[x].push_back(y);
}
findSCCs();
}