Pagini recente » Cod sursa (job #1125448) | Cod sursa (job #2751392) | Cod sursa (job #154820) | Cod sursa (job #698722) | Cod sursa (job #2343192)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define MAX 100010
using namespace std;
int n,m,na,x,y,nrz;
int t1[MAX],t2[MAX],z[MAX],az[MAX];
bool acc[MAX];
vector<int> nd[MAX],ndi[MAX],nrv;
pair<int,int> v[MAX];
stack<int> s;
bool cmp(pair<int,int> nr1, pair<int,int> nr2){
return nr1.second>nr2.second;
}
bool cmpz(int a1,int a2){
return z[a1]<z[a2];
}
void dfs(int nod){
z[nod]=nrz;
for(auto i:ndi[nod])
if(!z[i]){
z[i]=nrz;
dfs(i);
}
}
int main()
{
ifstream f ("ctc.in");
ofstream g ("ctc.out");
f>>n>>m;
for(int i=1;i<=m;i++)
f>>x>>y,
nd[x].push_back(y),
ndi[y].push_back(x);
for(int i=n;i>=1;i--)nrv.push_back(i);
s.push(1);
for(int ta=1;ta<=2*n;){
if(!s.size()){
while(acc[nrv.back()])nrv.pop_back();
s.push(nrv.back());
continue;
}
na=s.top();
if(t1[na]==0)t1[na]=ta++;
acc[na]=1;
while(nd[na].size()&&acc[nd[na].back()])
nd[na].pop_back();
if(nd[na].size()) s.push(nd[na].back());
else {
t2[na]=ta++;
s.pop();
}
}
for(int i=1;i<=n;i++)v[i]=make_pair(i,t2[i]),az[i]=i;
sort(v+1,v+n+1,cmp);
for(int i=1;i<=n;i++)
if(!z[v[i].first]){
nrz++;
dfs(v[i].first);
}
g<<nrz<<'\n';
sort(az+1,az+n+1,cmpz);
for(int i=1;i<=n;i++)cout<<t2[i]<<" ";
for(int i=1,za=1;za<=nrz;za++){
for(;z[az[i]]==za;i++)g<<az[i]<<" ";
g<<'\n';
}
f.close ();
g.close ();
return 0;
}