Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #904397) | Cod sursa (job #1376012)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
typedef vector<int> VI;
#define foor(it,v) for(__typeof(v.begin())it=v.begin();it!=v.end();++it)
vector <VI> G,G_t;
vector<VI> CTC;
VI st,zero;
vector<bool> viz;
int n,m,x,y,i;
void dfs(int nod)
{
viz[nod]=true;
foor(it,G[nod]) if(!viz[*it]) dfs(*it);
st.push_back(nod);
}
void dfs_t(int nod)
{
viz[nod]=true;
foor(it,G_t[nod]) if(!viz[*it]) dfs_t(*it);
CTC.back().push_back(nod);
}
int main()
{
f>>n>>m;
G.resize(n+1);
G_t.resize(n+1);
viz.resize(n+1,0);
for(;m;--m)
{
f>>x>>y;
G[x].push_back(y);
G_t[y].push_back(x);
}
for(i=1;i<=n;++i) if(!viz[i]) dfs(i);
viz.assign(n+1,0);
for(;st.size();st.pop_back()) if(!viz[st.back()])
{
CTC.resize(CTC.size()+1);
dfs_t(st.back());
}
g<<CTC.size()<<'\n';
foor(itc,CTC)
{
foor(it,(*itc)) g<<*it<<' ';
g<<'\n';
}
return 0;
}