Cod sursa(job #2766857)

Utilizator dinuionirinel10@gmail.comDinu Ion Irinel [email protected] Data 3 august 2021 17:53:52
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#include <fstream>
#include <list>
#include <stack>
#include <vector>
#include <string>

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

std::list<int> adj[100001];
std::list<int> adj2[100001];
int nr_comp = 0;

void dfs(int source, bool *visited) {
    visited[source] = true;
    fout << source << " ";
    for (auto it = adj2[source].begin(); it != adj2[source].end(); ++it) {
        if (!visited[*it]) {
            dfs(*it, visited);
        }
    }
}

void fillOrder(int source, bool *visited, std::stack<int>& stack) {
    visited[source] = true;
    for (auto it = adj[source].begin(); it != adj[source].end(); ++it) {
        if (!visited[*it]) {
            fillOrder(*it, visited, stack);
        }
    }
    stack.push(source);

}

int main(void) {

    // read inputs
    int n, m, nr_comp = 0;
    fin >> n >> m;

    for (int i = 1; i <= m; ++i) {
        int x, y;
        fin >> x >> y;
        adj[x].push_back(y);
        // transpose graph
        adj2[y].push_back(x);
    }   

    // k algorithm
    std::stack<int> stack;
    bool visited[n];
    for (int i = 1; i <= n; ++i) {
        visited[i] = false;
    }   

    for (int i = 1; i <= n; ++i) {
        if (!visited[i]) {
            fillOrder(i, visited, stack);
        }
    }

    for (int i = 1; i <= n; ++i) {
        visited[i] = false;
    }   

    while (!stack.empty()) {
        int top = stack.top();
        stack.pop();
        if (visited[top] == false) {
            ++nr_comp;
            dfs(top, visited);
            fout << "\n";
        }
    }
    
    fin.close();
    fout.close();
    std::ofstream temp("temp.out");
    std::ifstream fout("ctc.out");

    std::string line;
    while (!fout.eof()) {
          while(getline(fout,line)){
            temp << line << "\n";
        }
    }

    temp.close();
    fout.close();

    std::ifstream temp2("temp.out");
    std::ofstream fout2("ctc.out");

    fout2 << nr_comp << "\n";
    while (!temp2.eof()) {
          while(getline(temp2,line)){
            fout2 << line << "\n";
        }
    }

    temp2.close();
    fout2.close();
    std::remove("temp.out");

    return 0;
}