Pagini recente » Cod sursa (job #2710140) | Cod sursa (job #1317405) | Cod sursa (job #2618730) | Cod sursa (job #2336655) | Cod sursa (job #2506590)
#include<fstream>
#include<algorithm>
#define nmax 100005
#define mmax 200008
using namespace std;
ifstream f ("ctc.in");
ofstream g ("ctc.out");
bool fr[nmax];
int n,i,j,m,star[nmax],t[3][mmax],k,coloana,rezultat,stiva[nmax],element,varf,vecin,ordine[nmax],cnt,componente;
int starinvers[nmax],tinvers[3][mmax],kinvers;
int a[2*nmax],poz=0;
int main()
{
f>>n>>m;
while(m)
{
m--;
f>>i>>j;
k++;
t[0][k]=j;
t[1][k]=star[i];
star[i]=k;
kinvers++;
tinvers[0][kinvers]=i;
tinvers[1][kinvers]=starinvers[j];
starinvers[j]=kinvers;
}
for(i=1;i<=n;i++)
{
if(fr[i]==0)
{
stiva[++varf]=i;
fr[i]=1;
while(varf)
{
element=stiva[varf];
coloana=star[element];
int ok=0;
while(coloana && ok==0)
{
vecin=t[0][coloana];
if(fr[vecin]==0)
{
stiva[++varf]=vecin,ok=1,fr[vecin]=1;
}
coloana=t[1][coloana];
}
if(ok==0)
ordine[++cnt]=element,varf--;
}
}
}
for(i=n;i>=1;i--)
{
if(fr[ordine[i]]==1)
{
componente++;
a[++poz]=-1;
a[++poz]=ordine[i];
varf=0;
stiva[++varf]=ordine[i];
fr[ordine[i]]=0;
while(varf)
{
element=stiva[varf];
coloana=starinvers[element];
int ok=0;
while(coloana && ok==0)
{
vecin=tinvers[0][coloana];
if(fr[vecin]==1)
{
stiva[++varf]=vecin,ok=1,fr[vecin]=0;
a[++poz]=vecin;
}
coloana=tinvers[1][coloana];
}
if(ok==0)
varf--;
}
}
}
g<<componente;
j=1;
while(a[j])
{
if(a[j]!=-1)
g<<a[j]<<" ";
else
g<<'\n';
j++;
}
}