Pagini recente » Istoria paginii runda/cnrvxa1/clasament | Cod sursa (job #3214939) | Cod sursa (job #2294939) | Cod sursa (job #1147200) | Cod sursa (job #1164676)
#include<fstream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<deque>
#define N 100100
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
int n,m,i,ce,nrcc,nrctc,x,y,viz[N];
deque<int>dq;
vector<int>v[N],sol[N],t[N];
inline void dfs(int x){
viz[x]=nrcc;
for(vector<int>::iterator it=v[x].begin();it!=v[x].end();++it)
if(!viz[*it])
dfs(*it);
dq.push_back(x);
}
inline void dfs2(int x){
viz[x]=0;
sol[nrctc].push_back(x);
for(vector<int>::iterator it=t[x].begin();it!=t[x].end();++it)
if(viz[*it]==ce)
{
dfs2(*it);
}
}
int main()
{
f>>n>>m;
for(i=1;i<=m;++i)
{
f>>x>>y;
v[x].push_back(y);
t[y].push_back(x);
}
for(i=1;i<=n;++i)
if(!viz[i])
{
++nrcc;
dfs(i);
}
while(!dq.empty())
{
while(!dq.empty()&&!viz[dq.back()])
dq.pop_back();
if(dq.empty())
break;
++nrctc;
ce=viz[dq.back()];
dfs2(dq.back());
}
g<<nrctc<<'\n';
for(i=1;i<=nrctc;++i)
{
sort(sol[i].begin(),sol[i].end());
for(vector<int>::iterator it=sol[i].begin();it!=sol[i].end();++it)
g<<*it<<' ';
g<<'\n';
}
return 0;
}