Cod sursa(job #2925760)

Utilizator simonatudoroiuTudoroiu Simona simonatudoroiu Data 15 octombrie 2022 23:51:03
Problema Componente tare conexe Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <bits/stdc++.h>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int n,m, cc=0, id=0;
vector<vector<int>> raspuns;
void dfs(int nod, vector<vector<int>> &lista, vector<int> &id_nod, vector<int> &low_link, vector<bool> &apare_stiva, stack<int> &stiva)
{
    stiva.push(nod);
    apare_stiva[nod] = true;
    id_nod[nod] = id;
    low_link[nod] = id;
    id++;
    for(auto i=lista[nod].begin(); i!=lista[nod].end(); i++)
    {
        if(id_nod[*i] == -1)
        {
            dfs(*i, lista, id_nod, low_link, apare_stiva, stiva);
        }
        if(apare_stiva[*i] == true)
        {
            low_link[nod] = min(low_link[nod], low_link[*i]);
        }
    }
    if(id_nod[nod] == low_link[nod])
    {

        vector<int> temp;
        int c = stiva.top();
        temp.push_back(c);
        while(c != nod){
            apare_stiva[c] = false;
            low_link[c] = id_nod[nod];
            stiva.pop();
            c = stiva.top();
            temp.push_back(c);
        }
        apare_stiva[c] = false;
        low_link[c] = id_nod[nod];
        stiva.pop();
        cc++;
        raspuns.push_back(temp);
    }
}
int main(){

    vector<vector<int>> lista;
    vector<int> id_nod, low_link;
    vector<bool> apare_stiva;
    stack<int> stiva;
    fin>>n>>m;
    for(int i=0;i<=n;i++)
    {
        lista.push_back({});
        id_nod.push_back(-1);
        low_link.push_back(0);
        apare_stiva.push_back(false);
    }
    for(int i=0;i<m;i++)
    {
        int a,b;
        fin>>a>>b;
        lista[a].push_back(b);
    }
    for(int i=1; i<=n;i++)
    {
        if(id_nod[i] == -1)
        {
            dfs(i, lista,id_nod, low_link, apare_stiva, stiva);
        }
    }
    fout<<cc<<endl;
    for(auto i:raspuns)
    {
        for(auto j:i)
        {
            fout<<j<<" ";
        }
        fout<<endl;
    }
    return 0;
}