Cod sursa(job #2610480)

Utilizator _mirubMiruna-Elena Banu _mirub Data 4 mai 2020 22:17:00
Problema Sortare topologica Scor 100
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>
using namespace std;

const int kNmax = 100005;

class Task {
public:
    void solve() {
        read_input();
        print_output(get_result());
    }

private:
    int n;
    int m;
    vector<int> adj[kNmax];

    void read_input() {
        ifstream fin("sortaret.in");
        fin >> n >> m;
        for (int i = 1, x, y; i <= m; i++) {
            fin >> x >> y;
            adj[x].push_back(y);
        }
        fin.close();
    }

    void computeDFS(int node, vector<int> &visited, vector<int> &topsort) {
        // Mark node as visited
        visited[node] = 1;

        // Recursively visit every node
        for (auto &it : adj[node]) {
            if (!visited[it]) {
                computeDFS(it, visited, topsort);
            }
        }

        // End of topsort
        topsort.push_back(node);
    }

    vector<int> get_result() {
        vector<int> topsort;

        // All nodes are initially not visited
        vector<int> visited(n + 1, 0);

        // Start visiting from node 1
        for (int i = 1; i <= n; ++i) {
            if (!visited[i]) {
                computeDFS(i, visited, topsort);
            }
        }

        reverse(topsort.begin(), topsort.end());

        return topsort;
    }

    void print_output(vector<int> result) {
        ofstream fout("sortaret.out");
        for (int i = 0; i < int(result.size()); i++) {
            fout << result[i] << ' ';
        }
        fout << '\n';
        fout.close();
    }
};

// Please always keep this simple main function!
int main() {
    // Allocate a Task object on heap in order to be able to
    // declare huge static-allocated data structures inside the class.
    Task *task = new Task();
    task->solve();
    delete task;
    return 0;
}