Cod sursa(job #526957)

Utilizator APOCALYPTODragos APOCALYPTO Data 30 ianuarie 2011 00:51:51
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#define Nmax 100005
#define pb push_back
#define foreach(v)  for(typeof (v).begin() it=(v).begin();it!=(v).end();it++)
vector<int> G[Nmax];
vector<int> TG[Nmax];
vector<int> ans[Nmax];
vector<int>::iterator it;
struct nod{

   int first;
   int real;
};
nod a[Nmax];
ofstream fout("retele.out");
int N,M,nr=0,postord[Nmax],viz[Nmax];
bool cmp(nod i,nod j)
{
    return i.first<j.first;
}
void DFS(int u)
{    viz[u]=1;
vector<int>::iterator it;
    for(it=G[u].begin();it!=G[u].end();it++)
       if(viz[*it]==0)
        {    //cout<<*it<<" ";
            DFS(*it);

        }

   postord[++nr]=u;


}
void DFS2(int u)
{vector<int>::iterator it;
    viz[u]=0;
    for(it=TG[u].begin();it!=TG[u].end();it++)
       if(viz[*it])
        DFS2(*it);
    ans[nr].pb(u);

}
void solve()
{
    int i,j;
    for(i=1;i<=N;i++)
     if(!viz[i])
      {DFS(i);

      }
      nr=0;


    for(i=N;i>=1;i--)
     if(viz[postord[i]])
      {nr++;
      DFS2(postord[i]);
      }
    fout<<nr<<"\n";
    for(i=1;i<=nr;i++)
    {
    sort(ans[i].begin(),ans[i].end());
    a[i].real=i;
    a[i].first=ans[i][0];
    }

    sort(a+1,a+nr+1,cmp);

    /*for(i=1;i<=nr;i++)
    cout<<a[i].real<<" ";
    cout<<"\n";*/
        for(i=1;i<=nr;i++)
    {fout<<ans[a[i].real].size()<<" ";

     for(j=0;j<ans[a[i].real].size();j++)
       fout<<ans[a[i].real][j]<<" ";
     fout<<"\n";
    }
}
void cit()
{int i,x,y;
    ifstream fin("retele.in");
    fin>>N>>M;
    for(i=1;i<=M;i++)
    {  fin>>x>>y;
       G[x].pb(y);
       TG[y].pb(x);
    }
    fin.close();



}
int main()
{

    cit();
    solve();
    fout.close();
    return 0;
}