Pagini recente » Cod sursa (job #1131362) | Cod sursa (job #1032726) | Istoria paginii runda/3uqjey4/clasament | Cod sursa (job #1918219) | Cod sursa (job #711478)
Cod sursa(job #711478)
#include<cstdio>
#include<fstream>
#include<vector>
using namespace std;
#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;
ofstream fout("ctc.out");
freopen ("ctc.in", "r", stdin);
scanf ("%d %d",&n,&m);
for (i=1;i<=m;++i)
{ scanf ("%d %d",&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;
}