Cod sursa(job #1425833)

Utilizator PetrutiuPaulPetrutiu Paul Gabriel PetrutiuPaul Data 28 aprilie 2015 08:49:01
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

vector<int>G[100006];
vector<int>Gi[100006];
vector<int>Go[100006];
vector<int>used;
vector<int>where;
vector<int>discovered;
int n,m;

ifstream fin("ctc.in");
ofstream fout("ctc.out");

void DFP(const int n, vector<int>*G)
{

    vector<int>::iterator it;

    used[n]=1;

    for(it=G[n].begin();it!=G[n].end();it++)
    {
        if(used[*it]==0)
            DFP(*it,G);
    }

    discovered.push_back(n);

}

void DFM(const int n, vector<int>*G, const int which)
{

    vector<int>::iterator it;

    where[n]=which;

    for(it=G[n].begin();it!=G[n].end();it++)
    {
        if(where[*it]==-1)
            DFM(*it,G,which);
    }


}

int main()
{
    int x,y;

    fin>>n>>m;

    for(int i=1;i<=m;i++){
        fin>>x>>y;
        Go[x-1].push_back(y-1);
        Gi[y-1].push_back(x-1);
    }

    used.resize(n);
    used.assign(n,0);

    for(int i=1;i<=n;i++)
        if(used[i]==false)
            DFP(i,Go);

    where.resize(n);
    where.assign(n,-1);

    int coun=0;

    for(;discovered.size();discovered.pop_back())
    {
        if(where[discovered.back()]==-1)
            {
                DFM(discovered.back(),Gi,coun);
                coun++;
            }
    }

    for(int i=0;i<n;i++)
        G[where[i]].push_back(i);

    vector<int>::const_iterator it;

    fout<<coun<<'\n';

    for(int i=0;i<coun;i++)
        {
            for(it=G[i].begin();it!=G[i].end();it++)
                fout<<*it+1<<' ';
            fout<<'\n';
        }
}