Pagini recente » Cod sursa (job #928988) | Cod sursa (job #887489) | Cod sursa (job #1908493) | Cod sursa (job #434221) | Cod sursa (job #2206275)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
vector<vector<int> > G, GT,GG;
int n , m , contor , nrs ,l;
vector<bool> V;
vector<int> S;
void read()
{
in >> n >> m;
G = GT = GG = vector<vector<int> >(n + 1);
for(int i = 1 ; i <= m ; i++)
{
int a , b;
in >> a >> b;
G[a].push_back(b);
GT[b].push_back(a);
}
}
void dfs(int k)
{
V[k] = true;
for(int i=0;i<G[k].size();i++)
{
int vecin=G[k][i];
if(!V[vecin])
dfs(vecin);
}
S.push_back(k);
}
void dfsGT(int k)
{
V[k]=1;
for(int i=0;i<GT[k].size();i++)
{
int vecin=GT[k][i];
if(!V[vecin])
dfsGT(vecin);
}
GG[contor].push_back(k);
}
int main()
{
read();
V = vector<bool> (n + 1, false);
for(int i = 1 ; i <= n ; i ++)
if(! V[i])
dfs(i);
reverse(S.begin(),S.end());
V = vector<bool> (n + 1, false);
for(int i=0;i<S.size();i++)
{
int vecin=S[i];
if(!V[vecin]) {
contor ++;
dfsGT(vecin);
}
}
out<<contor<<"\n";
for(int i=1;i<=contor;i++)
{
for(int j=0;j<GG[i].size();j++)
out<<GG[i][j]<<" ";
out<<"\n";
}
return 0;
}