Pagini recente » Cod sursa (job #165854) | Cod sursa (job #2692552) | Monitorul de evaluare | Cod sursa (job #3356387) | Cod sursa (job #3336108)
#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define MOD 1000000007
#define NMAX 2e6
std::ifstream f("ctc.in");
std::ofstream g("ctc.out");
std::vector<std::vector<int>> v(100001), t(100001);
bool viz[100001], viz1[100001];
void dfs(int nod, std::vector<int>& temp), dfs1(int nod, std::vector<int>& st);
int main(){
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cout.tie(NULL);
f.tie(NULL);
g.tie(NULL);
int n, m;
f >> n >> m;
for(int i = 1, x, y; i <= m; ++i)
f >> x >> y, v[x].push_back(y), t[y].push_back(x);
std::vector<int> temp;
for(int i = 1; i <= n; ++i)
if(!viz[i])
dfs(i, temp);
reverse(temp.begin(), temp.end());
std::vector<std::vector<int>> ans;
for(auto i : temp)
if(!viz1[i]){
std::vector<int> st;
dfs1(i, st);
std::sort(st.begin(), st.end());
ans.push_back(st);
}
g << ans.size() << '\n';
for(auto i : ans){
for(auto it : i)
g << it << ' ';
g << '\n';
}
return 0;
}
void dfs(int nod, std::vector<int>& temp){
viz[nod] = 1;
for(auto i : v[nod])
if(!viz[i])
dfs(i, temp);
temp.push_back(nod);
}
void dfs1(int nod, std::vector<int>& st){
viz1[nod] = 1;
st.push_back(nod);
for(auto i : t[nod])
if(!viz1[i])
dfs1(i, st);
}