Pagini recente » Cod sursa (job #2655563) | Cod sursa (job #913838) | Cod sursa (job #112248) | Cod sursa (job #1516517) | Cod sursa (job #411892)
Cod sursa(job #411892)
#include<fstream>
using namespace std;
int n,m,nrc,ordine[100005],v[100005],vt[100005],timp;
struct nod{
int info;
nod *next;};
nod *g[100005],*gt[100005],*CTC[100005];
void adaugat(int a,int b);
void dfs(int k);
void dfst(int k,int nrc);
void kosaraju();
void adauga(int a,int b);
void afisare();
int main()
{
ifstream fin("ctc.in");
fin>>n>>m;
int i;
for(i=1;i<=m;i++)
{
int a,b;
fin>>a>>b;
adauga(a,b);
adaugat(a,b);
}
kosaraju();
afisare();
return 0;
}
void dfs(int k)
{
v[k]=1;
for(nod *p=g[k];p;p=p->next)
if(v[p->info]==0)
dfs(p->info);
ordine[++timp]=k;
}
void dfst(int k,int nrc)
{
vt[k]=nrc;
nod *q=new nod;
q->info=k;
q->next=CTC[nrc];
CTC[nrc]=q;
for(nod *p=gt[k];p;p=p->next)
if(vt[p->info]==0)
dfst(p->info,nrc);
}
void kosaraju()
{
int i;
for(i=1;i<=n;i++)
if(v[i]==0)
dfs(i);
for(i=timp;i;--i)
if(vt[ordine[i]]==0)
{
dfst(ordine[i],++nrc);
}
}
void adauga(int a,int b)
{
nod *p=new nod;
p->info=b;
p->next=g[a];
g[a]=p;
}
void adaugat(int a,int b)
{
nod *p=new nod;
p->info=a;
p->next=gt[b];
gt[b]=p;
}
void afisare()
{
freopen("ctc.out","w",stdout);
printf("%d",nrc);
printf("\n");
int i;
for(i=1;i<=nrc;i++)
{
for(nod *p=CTC[i];p;p=p->next)
printf("%d ",p->info);
printf("\n");
}
}