Cod sursa(job #2798306)

Utilizator vlad-123-123vlad calomfirescu vlad-123-123 Data 11 noiembrie 2021 09:46:01
Problema Componente tare conexe Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.32 kb


#include <iostream>
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

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

vector<vector<int> > adj, adjT, ctc;
vector<bool> visited, visitedT;

stack<int> mystack;

void dfs1(int nod) //dfs normal
{
    visited[nod] = true;
    for (int i = 0; i < adj[nod].size(); i++)
    {
        int curr = adj[nod][i];
        if (visited[curr] == false)
            dfs1(curr);
    }
    mystack.push(nod); // se pun in stack nodurile parcurse
}

void dfs2(int nod, vector<int> &vtemp)
{
    //cout<<nod<<" ";
    vtemp.push_back(nod);
    visitedT[nod] = true;
    for (int i = 0; i < adjT[nod].size(); i++)
    {
        int curr = adjT[nod][i];
        if (visitedT[curr] == false)
            dfs2(curr, vtemp);
    }
}
int main()
{
    int n, m, x, y;
    fin >> n >> m;
    adj = vector<vector<int> >(n + 1);  // adiacenta
    adjT = vector<vector<int> >(n + 1); // adiacenta transpusa

    for (int i = 1; i <= m; i++)
    {
        fin >> x >> y;
        adj[x].push_back(y);
        adjT[y].push_back(x);
    }
    visited = vector<bool>(n + 1, false);

    int nr = 0;
    // pas 1 facem dfs normal si obtinem nodurile in stack
    for (int i = 1; i <= n; i++)
        if (visited[i] == false)
            dfs1(i);

    ctc = vector<vector<int> >(n + 1);     // comp tare conexe
    visitedT = vector<bool>(n + 1, false); //vectorul de vizitate pt transpusa
    //vector<int> vtemp;
    int top;
    // pas 2 scoatem pe rand elem din mystack si pt fiecare facem dfs incepand de la el
    //cand se face dfs2 pe transpusa se iau pas cu pas ctc iar pt a trece la urm ctc trb facut asta "manual"
    while (!mystack.empty())
    {
        top = mystack.top();
        mystack.pop();
        if (visitedT[top] == false)
        {
            vector<int> vtemp;
            dfs2(top, vtemp); // in vtemp se stockeaza pe rand comp conexe iar apoi se copiaza in ctc care va fi si reziltatul finl
            ctc.push_back(vtemp);
            nr++;
        }
    }

    fout << nr << endl;

    //cout<<ctc.size() << endl;
   // bool ok;
    for (int i = 0; i < ctc.size(); i++)
    {
       // ok = false;
        for (int j = 0; j < ctc[i].size(); j++)
        {
            fout << ctc[i][j] << " ";
            //ok = true;
        }
        //if (ok)
            fout << endl;
    }
    return 0;
}