Pagini recente » Cod sursa (job #601105) | Cod sursa (job #2909127) | Borderou de evaluare (job #1293896) | Cod sursa (job #759605) | Cod sursa (job #2864237)
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
int t[2][200001],start[100001],t1[1][200001],start1[100001],n,m;
int stiva[100001],z;
int viz[100001],nrcmp;
void citire()
{
int i,k=0,x,y;
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y;
k++;
t[0][k]=y;
t[1][k]=start[x];
start[x]=k;
t1[0][k]=x;
t1[1][k]=start1[y];
start1[y]=k;
}
}
void df(int nod)
{
int p;
viz[nod]=1;
p=start[nod];
while(p)
{
if(viz[t[0][p]]==0)
df(t[0][p]);
p=t[1][p];
}
stiva[++z]=nod;
}
void df_inapoi(int nod)
{
int p;
viz[nod]=nrcmp;;
p=start1[nod];
while(p)
{
if(viz[t1[0][p]]==0)
df_inapoi(t1[0][p]);
p=t1[1][p];
}
}
int contor=0;
void afisare(int cod,int i)
{
if(i>=1)
{
if(viz[i]==cod) contor++;
afisare(cod,i-1);
if(viz[i]==cod)
{
g<<i<<" ";
viz[i]=0;
}
}
else g<<contor<<" ";
}
int main()
{
citire();
int i;
for(i=1;i<=n;i++)
if(viz[i]==0)
df(i);
for(i=1;i<=n;i++)
viz[i]=0;
nrcmp=0;
while(z)
{
if(viz[stiva[z]]==0)
{
nrcmp++;
df_inapoi(stiva[z]);
}
z--;
}
g<<nrcmp<<'\n';
for(i=1;i<=n;i++)
{
if(viz[i])
{
contor=0;
afisare(viz[i],n);
g<<'\n';
}
}
return 0;
}