Pagini recente » Cod sursa (job #3227954) | Cod sursa (job #1406020) | Monitorul de evaluare | Cod sursa (job #460861) | Cod sursa (job #1667326)
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
int n,m;
vector <int> G[100005],G1[100005],v;
vector <int> marcat;
string res="";
int k;
void dfs1(int nod)
{
marcat[nod]=1;
for(auto p : G1[nod])
if(!marcat[p])
dfs1(p);
v.push_back(nod);
}
void dfs2(int nod,int comp)
{
marcat[nod]=comp;
int a=nod;
while(a)
res+=('0'+a%10),a/=10;
res+=' ';
for(auto p : G[nod])
if(!marcat[p])
dfs2(p,comp);
}
int main()
{
f>>n>>m;
marcat.resize(n+1);
for(int i=0;i<m;i++)
{
int a,b;
f>>a>>b;
G[a].push_back(b);
G1[b].push_back(a);
}
for(int i=1;i<=n;i++)
if(!marcat[i])
dfs1(i);
fill(begin(marcat),end(marcat),0);
int nr=v.size()-1;
for(;nr>=0;nr--)
if(!marcat[v[nr]])
{
dfs2(v[nr],k+1);
k++;
res+='\n';
}
g<<k<<"\n";
g<<res;
}