Pagini recente » Profil Djok | Istoria paginii preoni-2007/clasament/runda-3/10 | Istoria paginii runda/7_martie_simulare_oji_2024_clasa_10/clasament | Cod sursa (job #1609917)
#include <bits/stdc++.h>
using namespace std;
ifstream in("ctc.in");
ofstream out("ctc.out");
vector< vector<int> > a;
vector< vector<int> > b;
vector< vector<int> > c;
vector<bool> v;
int p[100001],n,k;
void dfs(int x)
{
v[x]=true;
for(vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
if(v[*i]==false)
dfs(*i);
p[++k]=x;
}
void dfss(int x)
{
v[x]=false;c[k].push_back(x);
for(vector<int>::iterator i=b[x].begin();i!=b[x].end();i++)
if(v[*i]==true)
dfss(*i);
}
int main()
{
int m,x,y;
in>>n>>m;
a=vector< vector<int> >(n+1);
b=vector< vector<int> >(n+1);
c=vector< vector<int> >(n+1);
v=vector<bool>(n+1);
for(;m;m--)
{
in>>x>>y;
a[x].push_back(y);
b[y].push_back(x);
}
for(int i=1;i<=n;i++)
if(v[i]==false)
dfs(i);
k=0;
for(int i=n;i;i--)
if(v[p[i]]==true)
{
++k;
dfss(p[i]);
}
out<<k<<'\n';
for(int i=1;i<=k;i++)
{
for(vector<int>::iterator it=c[i].begin();it!=c[i].end();it++)out<<*it<<' ';
out<<'\n';
}
return 0;
}