Pagini recente » Cod sursa (job #3223266) | Cod sursa (job #1474696) | Borderou de evaluare (job #2312912) | Cod sursa (job #3139310) | Cod sursa (job #711467)
Cod sursa(job #711467)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
#define lung 100005
int n, m;
vector <int> v[lung], vt[lung],sol[lung];
int poz[lung],nr,rasp;
bool viz[lung];
inline void df(int k)
{ vector <int> ::iterator it;
viz[k] = true;
for(it=v[k].begin();it!=v[k].end();++it)
if (!viz[*it])
df(*it);
poz[++nr] = k;
}
void dft(int k)
{ vector <int> ::iterator it;
viz[k] = false;
sol[rasp].push_back(k);
for(it=vt[k].begin();it!=vt[k].end();++it)
if (viz[*it])
dft(*it);
}
int main()
{int a,b,i,j;
fin >> n >> m;
for (i=1;i<=m;++i)
{ fin >> a >> b;
v[a].push_back(b);
vt[b].push_back(a);
}
for (i=1;i<=n;++i)
if (!viz[i])
df(i);
for (i=n;i>=1;--i)
if (viz[poz[i]])
{ ++rasp;
dft(poz[i]);
}
fout << rasp << '\n';
for (i=1;i<=rasp;++i)
{ for (j=0;j<sol[i].size();++j)
fout << sol[i][j] << " ";
fout << '\n';
}
return 0;
}