Cod sursa(job #2928270)

Utilizator IonescuRalucaIonescu Andreea Raluca IonescuRaluca Data 22 octombrie 2022 16:49:36
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
////complexitate O(V+E)
#include <iostream>
#include <fstream>
#include <stack>
#include<vector>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
vector<vector<int>> componente;
vector<vector<int>> listaAd;
vector<vector<int>> listaAdTr;
vector<bool>vizitat;
stack<int> stiva;
int noduri,muchii,x,y,i,j,nod;

void creareListaAdiacenta()
{
    for(int i=0;i<muchii;i++)
    {
        f>>x>>y;
        listaAd[x].push_back(y);
    }
}
//void afisareListaAdiacenta()
//{
//    for(int x=1; x<=noduri;x++)
//    {
//        cout<<x<<": ";
//        for(auto y:listaAd[x])
//            cout<<y<<" , ";
//        cout<<endl;
//    }
//}
void DFS(int nod)
{
    vizitat[nod]=1;

    auto vecini=listaAd[nod];
    for(auto x:vecini)
        if(!vizitat[x])
            DFS(x);
    stiva.push(nod);
}

////graf inversat (graf in care directiile arcelor sunt inversate)
void transp()
{
    for(i=1;i<=noduri;i++)
        for(auto nod:listaAd[i])
            listaAdTr[nod].push_back(i);
    for(i=1;i<=noduri;i++)
        vizitat[i]=0;

}
////creeaza vectorul de vectori cu diferitele comp tari conexe
void compConexe(int nod,int j)
{
    vizitat[nod]=1;
    componente[j].push_back(nod);
    auto vecini=listaAdTr[nod];
    for(auto x:vecini)
        if(!vizitat[x])
            compConexe(x,j);
}
int main()
{

    f>>noduri;
    f>>muchii;

    listaAd.resize(noduri+1);
    listaAdTr.resize(noduri+1);
    vizitat.resize(noduri+1);

    creareListaAdiacenta();

    for(nod=1;nod<=noduri;nod++)
        if(!vizitat[nod])
            DFS(nod);////punem nodurile in stiva prin DFS

    transp(); //// listaAdTr=lista de adiacenta a
            //// grafului inversat+reinitializarea vectorului "vizitat" cu 0

    componente.resize(noduri+1);
    while(!stiva.empty())
    {
        nod=stiva.top();
        stiva.pop();
        ////vector de vectori care contine
        //// componentele tare conex
        if(!vizitat[nod])
        {   j++;
            compConexe(nod,j);
        }
    }
    g<<j<<"\n";
    for(i=1;i<=j;i++)
    {
        for(auto x:componente[i])
           g<<x<<" ";
        g<<"\n";
    }

    f.close();
    g.close();

    return 0;
}