Pagini recente » Cod sursa (job #61236) | Cod sursa (job #100121) | Cod sursa (job #2459830) | Cod sursa (job #873041) | Cod sursa (job #1360618)
#include <fstream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
ifstream F("ctc.in");
ofstream G("ctc.out");
const int N = 100010;
int n,m,mk[N];
vector<int> v[N],w[N],stk,now;
vector< vector<int> > ctc;
void go(int x)
{
mk[x] = 1;
for (int i=0;i<int(v[x].size());++i)
{
int y = v[x][i];
if ( mk[y] == 0 )
go(y);
}
stk.push_back(x);
}
void go2(int x)
{
mk[x] = 1;
now.push_back(x);
for (int i=0;i<int(w[x].size());++i)
{
int y = w[x][i];
if ( mk[y] == 0 ) go2(y);
}
}
int main()
{
F>>n>>m;
for (int i=1,x,y;i<=m;++i)
{
F>>x>>y;
v[x].push_back(y);
w[y].push_back(x);
}
for (int i=1;i<=n;++i)
if (mk[i] == 0 )
go(i);
memset(mk,0,sizeof(mk));
while ( !stk.empty() )
{
int x = stk.back();
stk.pop_back();
if ( mk[x] == 0 )
{
go2(x);
ctc.push_back(now);
now.clear();
}
}
G<<ctc.size()<<'\n';
for (int i=0;i<int(ctc.size());++i)
{
now = ctc[i];
sort(now.begin(),now.end());
for (int j=0;j<int(now.size());++j)
G<<now[j]<<' ';
G<<'\n';
}
}