Cod sursa(job #1568460)

Utilizator PetrutiuPaulPetrutiu Paul Gabriel PetrutiuPaul Data 14 ianuarie 2016 11:54:05
Problema Componente tare conexe Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

vector <int> G[10000];
vector <int> Gi[10000];
vector <int> Go[10000];
vector <int> where;
vector <int> used;
vector <int> discovered;

void DFP(const int nod, vector<int> *G)
{
    vector <int> :: iterator it;
    used[nod]=1;

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

    discovered.push_back(nod);
}

void DFM(const int nod, const int witch, vector<int> *G)
{
    vector <int> :: iterator it;
    where[nod]=witch;

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


int main()
{
    int n, m, 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,0);

    where.resize(n,-1);

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

     int coun=0;

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

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

    vector<int>:: 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';
        }

}