Pagini recente » Cod sursa (job #2354480) | Cod sursa (job #770890) | Cod sursa (job #1577145) | **** | Cod sursa (job #397015)
Cod sursa(job #397015)
using namespace std;
#include<iostream>
#include<cstdio>
#include<vector>
#define MAX 100005
struct nod{
int info;
nod *next;
};
nod *G[MAX], *Gt[MAX];
vector<int> ct[MAX];
int n,ord[MAX],timp,v[MAX],vt[MAX],NR[MAX],nr,nrc;
void citire()
{
int i,m,a,b;
nod *p;
scanf("%d%d", &n, &m);
for(i=1;i<=n;i++)
G[i]=Gt[i]=NULL;
for(i=1;i<=m;i++)
{
scanf("%d%d", &a, &b);
p=new nod;
p->info=b;
p->next=G[a];
G[a]=p;
p=new nod;
p->info=a;
p->next=Gt[b];
Gt[b]=p;
}
}
void dfs(int varf)
{
v[varf]=1;
for(nod *p=G[varf];p;p=p->next)
if(v[p->info]==0)
dfs(p->info);
ord[++timp]=varf;
}
void dfst(int varf,int nrc)
{
nod *p;
vt[varf]=nrc;
ct[nrc].push_back(varf);
//sort(nrc);
for(p=Gt[varf]; 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>0;i--)
if(vt[ord[i]]==0)
dfst(ord[i],++nrc);
}
void write2()
{
printf("%d\n",nrc);
int i,j,nr;
for(i=1;i<=nrc;i++)
{
nr=ct[i].size();
printf("%d ", nr);
for(j=0;j<nr;j++)
printf("%d ", ct[i][j]);
printf("\n");
}
}
void Afis(nod *G[]){
for(int i=1;i<=n;++i){
printf("%d : ",i);
for(nod *p=G[i]; p ; p=p->next)
printf("%d ",p->info);
printf("\n");
}
}
int main()
{
freopen("ctc.in","r",stdin);
freopen("ctc.out","w",stdout);
citire();
kosaraju();
write2();
return 0;
}