Cod sursa(job #2796576)

Utilizator dariarunceanuRunceanu Daria dariarunceanu Data 8 noiembrie 2021 14:59:20
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.46 kb
#include <iostream>
#include<fstream>
#include <list>
#include <vector>


using namespace std;

#define nevizitat -1

vector <int> indecsi, low_link, stiva;
vector <list<int>>componente;
list <int> componenta;
vector <bool> in_stiva;
int idd, numar_componente;
int N,M;
vector<list<int> > L;



/*void afisare2(vector<list<int> > &L)
{
    for(int i = 1; i<L.size();i++)
    {
        cout << i << ":";
        for(int j:L[i])
            cout << j << " ";
        cout << "\n";
    }
}
*/
void citireGraf(int &N, int &M, vector<list<int>> &L, const char *filename)
{
    ifstream fin(filename);
    int x,y;
    fin >> N >> M;
    L.resize(N+1);
    for (int i=1; i<=M; i++)
    {
        fin >> x >> y;
        L[x].push_back(y);

    }
    fin.close();
}
afisare_componente(const vector<list<int>>&C, const char *filename)
{
    ofstream fout(filename);
    fout << numar_componente << "\n";
    for(int i=0; i<numar_componente; i++)
    {
        for(auto nod: C[i])
            fout << nod << " ";
        fout << "\n";
    }
    fout.close();
}

void tarjan_dfs(int id, const vector<list<int>>L)
{
    indecsi[id] = low_link[id] = idd++;
    stiva.push_back(id);
    in_stiva[id] = true;

    for(auto nod : L[id])
    {
        if(indecsi[nod] == nevizitat)
            tarjan_dfs(nod, L);

        if(in_stiva[nod])
            low_link[id] = low_link[nod] < low_link[id] ? low_link[nod]: low_link[id];
    }



    if(indecsi[id] == low_link[id])
    {
        int nod;
        componenta.clear();
        //cout << "Componenta " << numar_componente + 1 << " contine nodurile: ";
        do
        {
            nod = stiva.back();
            //cout << nod << " ";
            componenta.push_back(nod);
            stiva.pop_back();
            in_stiva[nod] = false;


        } while(nod != id);

        //cout << "\n";
        componente.push_back(componenta);
        numar_componente++;


    }

}


int main()
{

    citireGraf(N,M,L,"ctc.in");

   // afisare2(L);

    indecsi.resize(N+1), indecsi.assign(N+1, nevizitat);
    low_link.resize(N+1), low_link.assign(N+1,0);
    in_stiva.resize(N+1), in_stiva.assign(N+1, false);

    for(int i = 1; i<= N; i++)
        if(indecsi[i] == nevizitat)
            tarjan_dfs(i, L);

    //cout << "Numarul de componente tare conexe: " << numar_componente << "\n";

    afisare_componente(componente,"ctc.out");


    return 0;
}