Pagini recente » Cod sursa (job #1843534) | Cod sursa (job #321066) | Cod sursa (job #1228057) | Cod sursa (job #2636258) | Cod sursa (job #529682)
Cod sursa(job #529682)
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#define N 100001
#define M 200001
typedef struct stack
{long st[M],sp;};
stack s,q;
long n,m,a[M],b[M],deg[N]={0},*g[N],k,i,j,t,ind=0,c[N]={0},l[N],nr,r;
void push(stack &s,long x)
{s.st[++s.sp]=x;}
long pop(stack &s)
{return s.st[s.sp--];}
int apartine(stack &s,long x)
{long i;
for(i=1;i<=s.sp;i++)
if(s.st[i]==x)
return 1;
return 0;}
void tarjan(long i,long *nr,long *ind)
{long k,j,r;
push(s,i);
c[i]=(*ind);
l[i]=(*ind)++;
for(j=0;j<deg[i];j++)
if(c[g[i][j]]==0)
{tarjan(g[i][j],nr,ind);
if(l[i]>l[g[i][j]])
l[i]=l[g[i][j]];}
else
if(apartine(s,g[i][j])==1&&l[i]>c[g[i][j]])
l[i]=c[g[i][j]];
if(c[i]==l[i])
{k=0;
(*nr)++;
while(s.sp!=0)
{r=pop(s);
if(apartine(q,r)==0)
if(r!=i)
push(q,r);
else
break;
else
break;}
if(apartine(q,i)==0)
push(q,i);
if(q.st[s.sp]==0)
(*nr)--;
else
push(q,0);}}
int main()
{ifstream f1("ctc.in");
ofstream f2("ctc.out");
f1>>n>>m;
for(k=1;k<=m;k++)
{f1>>a[k]>>b[k];
deg[a[k]]++;}
for(i=1;i<=n;i++)
{g[i]=(long*)malloc(deg[i]*sizeof(long));
deg[i]=0;}
for(j=1;j<=m;j++)
g[a[j]][deg[a[j]]++]=b[j];
ind=0;
nr=0;
s.sp=0;
q.sp=0;
for(i=1;i<=n;i++)
if(c[i]==0)
tarjan(i,&nr,&ind);
f2<<nr<<endl;
for(j=1;j<=nr;j++)
{r=pop(q);
while(r!=0)
{f2<<r<<" ";
r=pop(q);}
f2<<endl;}
f1.close();
f2.close();
return 0;}