Cod sursa(job #390997)

Utilizator lorandCsorba Lorand-Alexandru lorand Data 4 februarie 2010 21:43:16
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
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;
}