Cod sursa(job #834580)

Utilizator ard_procesoareLupicu ard_procesoare Data 14 decembrie 2012 18:46:20
Problema Componente tare conexe Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
#define NMAX 100005
vector <int> v[NMAX],t[NMAX],sol[NMAX];
int ms[NMAX],ps[NMAX],k;
bool scos[NMAX];
int n,m,rez;
void init()
{
    for(int i=1;i<NMAX;i++)
        ms[i]=ps[i]=false;
}
void dfs(int nod,vector <int> a[NMAX],int viz[NMAX])
{
        viz[nod]=k;
        for(int i=0;i<a[nod].size();i++)
        {
            if(viz[a[nod][i]] != k )
                dfs(a[nod][i],a,viz);
        }
}
void read()
{
    int i,a,b;
    fin>>n>>m;
    for(i=0;i<m;i++)
    {
        fin>>a>>b;
        v[a].push_back(b);
        t[b].push_back(a);
    }
}
void solve(int nod)
{
   // init();
    rez++;k++;
    dfs(nod,v,ms);
    dfs(nod,t,ps);
    for(int i=1;i<=n;i++)
        if(ms[i]==k && ps[i]==k)
        {
            scos[i]=true;
            sol[rez].push_back(i);
        }
}
void tipar()
{
    fout<<rez<<"\n";
    for(int i=1;i<=rez;i++)
    {
        for(int j=0;j<sol[i].size();j++)
            fout<<sol[i][j]<<" ";
        fout<<"\n";
    }
}
int main()
{
    read();
    int i;
    for(i=1;i<=n;i++)
    {
        if(scos[i]== false )
        solve(i);
    }
    tipar();
}