Cod sursa(job #2928381)

Utilizator Andreeamiruna27Mindrescu Andreea Andreeamiruna27 Data 22 octombrie 2022 20:48:47
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;


ifstream f ("ctc.in");
ofstream g("ctc.out");

int noduri, muchii;
int nrcomptconexe;
vector <vector<int>> ad;
vector <vector<int>> ad_t;
vector <vector<int>> comp;
vector <int> stiva;
vector <int> nivel;

void read()
{
    int a;
    f>>noduri>>muchii;
    ad.resize(noduri+1);
    ad_t.resize(noduri+1);
    for(a=1; a<=muchii; a++)
    {
        int A, B;
        f>>A>>B;
        ad[A].push_back(B);
        ad_t[B].push_back(A);
    }
}

void dfs(int n)
{
    for(int i=0; i<ad[n].size(); i++)
    {
        if(nivel[ad[n][i]]==0)
        {
            nivel[ad[n][i]]=1;
            dfs(ad[n][i]]);
        }
    }
    stiva.push_back(n);
}
void dfs_t(int n)
{
    int j;
    comp[nrcomptconexe].push_back(n);
    nivel[n]=2;
    for(j=0; j<ad_t[n].size(); j++)
    {
        if(nivel[ad_t[n][j]]==1)
            dfs_t(ad_t[n][j]);
    }
}

void afis()
{
    int j;
    g<<nrcomptconexe<<"\n";
    for(j=1; j<=nrcomptconexe; j++)
    {
        for(int i=0; i<comp[j].size(); i++)
            g<<comp[j][i];
        g<<"\n";
    }
}

int main()
{
    int a, nod;
    read();
    nivel.resize(noduri+1);
    comp.resize(noduri+1);
    for(a=1; a<=noduri; a++)
        nivel[a]=0;
    for(a=1; a<=noduri; a++)
        if(nivel[a]==0)
    {
        nivel[a]=1;
        dfs(a);
    }
    while(stiva.empty()==0)
    {
        nod=stiva.back();
        stiva.pop_back();
        if(nivel[nod]==1)
        {
            nrcomptconexe++;
            dfs_t(nod);
        }
    }
    afis();
    return 0;
}