Pagini recente » Rating Ana-Maria-Iulia Bogdan (anabogdan) | Monitorul de evaluare | Cod sursa (job #2270840) | Statistici Gabriel Pereira de Carvalho (Arkham_Knight) | Cod sursa (job #918331)
Cod sursa(job #918331)
#include <cstdio>
#include <vector>
const int MAX_N(100001);
int n, m;
std::vector<int> graph [MAX_N];
std::vector<int> components [MAX_N];
std::vector<int> transpose [MAX_N];
bool mark [MAX_N];
int stack [MAX_N], *top(stack);
int c [MAX_N], scc;
inline void read (void)
{
std::freopen("ctc.in","r",stdin);
std::scanf("%d %d",&n,&m);
int x, y;
for (int i(1) ; i <= m ; ++i)
{
std::scanf("%d %d",&x,&y);
graph[x].push_back(y);
transpose[y].push_back(x);
}
std::fclose(stdin);
}
inline void print (void)
{
std::freopen("ctc.out","w",stdout);
std::printf("%d\n",scc);
int i, j, end;
for (i = 1 ; i <= scc ; ++i)
{
for (j = 0, end = components[i].size() ; j < end ; ++j)
std::printf("%d ",components[i][j]);
std::putchar('\n');
}
std::fclose(stdout);
}
void dfs_topo (int node)
{
for (int i(0), end(graph[node].size()) ; i < end ; ++i)
if (!mark[graph[node][i]])
{
mark[graph[node][i]] = true;
dfs_topo(graph[node][i]);
}
++top;
*top = node;
}
inline void toposort (void)
{
for (int i(1) ; i <= n ; ++i)
if (!mark[i])
{
mark[i] = true;
dfs_topo(i);
}
}
void dfs (int node)
{
for (int i(0), end(transpose[node].size()) ; i < end ; ++i)
if (!c[transpose[node][i]])
{
c[transpose[node][i]] = scc;
dfs(transpose[node][i]);
}
}
inline void Kosaraju (void)
{
while (top > stack)
{
if (!c[*top])
{
++scc;
dfs(*top);
}
--top;
}
for (int i(1) ; i <= n ; ++i)
components[c[i]].push_back(i);
}
int main (void)
{
read();
toposort();
Kosaraju();
print();
return 0;
}