Pagini recente » Cod sursa (job #799845) | Cod sursa (job #2283780) | Cod sursa (job #1553565) | Cod sursa (job #227420) | Cod sursa (job #1276565)
#include <bits/stdc++.h>
using namespace std;
typedef struct
{
int urm;
int nod;
} lista;
const int Nmax = 100000 + 1;
const int Mmax = 300000 + 1;
int vecini[Mmax];
lista G[Mmax];
int d[Nmax];
int stiva[Nmax], top;
bool onStack[Nmax];
vector <int> SCC[Nmax];
int N, M, numSCC;
void addEdge( int x, int y, int p )
{
G[p].nod = y;
G[p].urm = vecini[x];
vecini[x] = p;
}
void DFS( int nod, int depth )
{
d[nod] = depth;
stiva[ ++top ] = nod;
onStack[nod] = 1;
int p = vecini[nod];
while ( p )
{
int vecin = G[p].nod;
if ( d[vecin] == 0 )
{
DFS( vecin, depth + 1 );
d[nod] = min( d[nod], d[vecin] );
}
else
if ( onStack[vecin] )
{
d[nod] = min( d[nod], d[vecin] );
}
p = G[p].urm;
}
if ( d[nod] == depth )
{
numSCC++;
int v;
do
{
v = stiva[top--];
onStack[v] = 0;
SCC[numSCC].push_back( v );
} while ( v != nod );
}
}
int main()
{
ifstream in("ctc.in");
ofstream out("ctc.out");
ios_base::sync_with_stdio( false );
in >> N >> M;
for ( int i = 1, a, b; i <= M; ++i )
{
in >> a >> b;
addEdge( a, b, i );
}
for ( int i = 1; i <= N; ++i )
if ( d[i] == 0 )
DFS( i, 1 );
out << numSCC << "\n";
for ( int i = 1; i <= numSCC; ++i )
{
for ( auto x: SCC[i] )
out << x << " ";
out << "\n";
}
return 0;
}