Pagini recente » Cod sursa (job #1960210) | Cod sursa (job #2441604) | Cod sursa (job #3163665) | Cod sursa (job #440727) | Cod sursa (job #2926243)
#include <queue>
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
#define NMax 100005
vector <int> G[NMax];
vector <int> GT[NMax];
vector <int> result[NMax];
int n,m,counter;
stack<int> S;
int *visited;
void read()
{
counter = 0;
f>>n>>m;
visited = new int[NMax];
for(int i = 0; i<=n+1;i++)
visited[i] = 0;
for(int i=1;i<=m;i++)
{
int x,y;
f>>x>>y;
G[x].push_back(y);
GT[y].push_back(x);
}
}
void showList()
{
cout<<"n: "<<n<<endl;
for(int i=1;i<=n;i++)
{
cout<<i<<": ";
for(int j=0;j<GT[i].size();j++)
cout<<GT[i][j]<<" ";
cout<<endl;
}
}
void DFS(int node)
{
visited[node] = 1;
//zone 1
for(int i=0;i<G[node].size();i++)
{
//zone 2
int neighbour = G[node][i];
if(!visited[neighbour])
DFS(neighbour);
//zone 3
}
S.push(node);
//zone 4
}
void DFS_T(int node)
{
visited[node] = 2;
result[counter].push_back(node);
cout<<counter<<": "<<node<<"\n";
for(int i=0;i<GT[node].size();i++)
{
int neighbour = GT[node][i];
if(visited[neighbour] == 1)
DFS_T(neighbour);
}
}
void Solution()
{
for(int i=1;i<=n;i++)
{
if(!visited[i])
DFS(i);
}
while(!S.empty())
{
int node = S.top();
//cout<<node<<" ";
if(visited[node] == 1)
{
counter++;
DFS_T(node);
}
S.pop();
}
}
void printResult()
{
g<<counter<<"\n";
for(int i=1;i<=counter;i++)
{
for(int j=0;j<result[i].size();j++)
g<<result[i][j]<<" ";
g<<endl;
}
}
int main()
{
read();
//showList();
Solution();
printResult();
return 0;
}