Pagini recente » Cod sursa (job #646660) | Cod sursa (job #2980900) | Clasamentul arhivei de probleme | Cod sursa (job #1393102) | Cod sursa (job #390999)
Cod sursa(job #390999)
using namespace std;
#include<fstream>
struct nod
{
int vf;
nod* next;
};
int n,m,s,d,*v,*viz,*pluss,*minuss,*coada;
nod *G[100005],*Gt[100005];
void addarc(int,int);
int main()
{
nod *p;
int i,x,y;
ifstream fin("ctc.in");
fin>>n>>m;
for(i=1;i<=m;++i)
{
fin>>x>>y;
addarc(x,y);
}
v=new int[n+1];
for(i=1;i<=n;++i)
v[i]=0;
x=0;
viz=new int[n+1];
pluss=new int[n+1];
minuss=new int[n+1];
coada=new int[n+1];
for(i=1;i<=n;++i)
if(v[i]==0)
{
for(y=1;y<=n;++y)
viz[y]=pluss[y]=0;
s=d=1;
coada[d]=i;
while(s<=d)
{
pluss[coada[s]]=1;
for(p=G[coada[s]];p;p=p->next)
if(viz[p->vf]==0)
{
viz[p->vf]=1;
coada[++d]=p->vf;
}
++s;
}
for(y=1;y<=n;++y)
viz[y]=minuss[y]=0;
s=d=1;
coada[d]=i;
while(s<=d)
{
minuss[coada[s]]=1;
for(p=Gt[coada[s]];p;p=p->next)
if(viz[p->vf]==0)
{
viz[p->vf]=1;
coada[++d]=p->vf;
}
++s;
}
++x;
for(y=1;y<=n;++y)
if(pluss[y]*minuss[y])
v[y]=x;
}
ofstream fout("ctc.out");
fout<<x<<'\n';
for(i=1;i<=x;++i)
{
for(y=1;y<=n;++y)
if(v[y]==i)
fout<<y<<' ';
fout<<'\n';
}
return 0;
}
void addarc(int i,int j)
{
nod *p=new nod;
p->vf=j;
p->next=G[i];
G[i]=p;
nod *q=new nod;
q->vf=i;
q->next=Gt[j];
Gt[j]=q;
}