Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int Max=100005;
- vector <int>v[Max],vt[Max],bt[Max],poz,ctc2[Max];
- stack <int>s;
- bool viz[Max];
- int nr,n,m,ctc[Max],q,tata[Max],ccc[Max];
- void dfs1(int nod)
- {
- viz[nod]=1;
- for(int j=0;j<v[nod].size();++j)
- {
- int vecin=v[nod][j];
- if(!viz[vecin])
- dfs1(vecin);
- }
- s.push(nod);
- }
- void dfs2(int nod)
- {
- viz[nod]=0;ctc[nod]=nr;ctc2[nr].push_back(nod);
- for(int j=0;j<vt[nod].size();++j)
- {
- int vecin=vt[nod][j];
- if(viz[vecin])
- dfs2(vecin);
- }
- }
- void citire()
- {
- cin>>n>>m;
- int x,y;
- for(int i=1;i<=m;++i)
- cin>>x>>y,v[x].push_back(y),vt[y].push_back(x);
- }
- int main()
- {
- citire();
- for(int i=1;i<=n;++i)
- if(!viz[i])
- dfs1(i);
- while(!s.empty())
- {
- int nod=s.top();
- s.pop();
- if(viz[nod])
- ++nr,dfs2(nod);
- }
- nr=1;int x=ctc[1];
- for(int i=1;i<=n;++i)
- {
- if(x!=ctc[i] && ccc[i]==0)
- ++nr,x=ctc[i];
- for(int j=0;j<ctc2[x].size();++j)
- ccc[ctc2[x][j]]=nr;
- }
- for(int i=1;i<=n;++i)
- for(int j=0;j<v[i].size();++j)
- {
- int vecin=v[i][j];
- if(ccc[i]!=ccc[vecin])
- bt[ccc[i]].push_back(ccc[vecin]);
- }
- for(int i=1;i<=n;++i)
- sort(bt[i].begin(),bt[i].end());
- for(int i=1;i<=nr;++i)
- {
- for(int j=0;j<bt[i].size();++j)
- cout<<bt[i][j]<<' ';
- if(bt[i].size()==0)
- cout<<0;
- cout<<'\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment