This documentation is automatically generated by online-judge-tools/verification-helper
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/library/5/GRL/all/GRL_4_B"
#include "../Graph/topological_sort.hpp"
#include <iostream>
int main() {
std::cin.tie();
std::ios::sync_with_stdio(false);
int n, m;
std::cin >> n >> m;
Graph<> graph(n);
while (m--) {
int u, v;
std::cin >> u >> v;
graph.span(true, u, v);
}
TopologicalSort<> ts(graph);
for (int v : ts.vs) std::cout << v << "\n";
return 0;
}#line 1 "Verify/topological_sort.test.cpp"
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/library/5/GRL/all/GRL_4_B"
#line 2 "Graph/topological_sort.hpp"
#line 2 "Graph/graph.hpp"
#include <vector>
template <class Cost = int>
struct Edge {
int src, dst;
Cost cost;
Edge() = default;
Edge(int src, int dst, Cost cost = 1)
: src(src), dst(dst), cost(cost){};
bool operator<(const Edge<Cost>& e) const { return cost < e.cost; }
bool operator>(const Edge<Cost>& e) const { return cost > e.cost; }
};
template <class Cost = int>
struct Graph : public std::vector<std::vector<Edge<Cost>>> {
using std::vector<std::vector<Edge<Cost>>>::vector;
void span(bool direct, int src, int dst, Cost cost = 1) {
(*this)[src].emplace_back(src, dst, cost);
if (!direct) (*this)[dst].emplace_back(dst, src, cost);
}
};
#line 4 "Graph/topological_sort.hpp"
#include <algorithm>
template <class Cost = int>
struct TopologicalSort {
Graph<Cost> graph;
std::vector<bool> visited;
std::vector<int> vs, id;
explicit TopologicalSort(const Graph<Cost>& graph)
: graph(graph), visited(graph.size(), false), id(graph.size()) {
for (int v = 0; v < (int)graph.size(); ++v) dfs(v);
std::reverse(vs.begin(), vs.end());
for (int i = 0; i < (int)graph.size(); ++i) id[vs[i]] = i;
}
void dfs(int v) {
if (visited[v]) return;
visited[v] = true;
for (const auto& e : graph[v]) dfs(e.dst);
vs.push_back(v);
}
};
#line 4 "Verify/topological_sort.test.cpp"
#include <iostream>
int main() {
std::cin.tie();
std::ios::sync_with_stdio(false);
int n, m;
std::cin >> n >> m;
Graph<> graph(n);
while (m--) {
int u, v;
std::cin >> u >> v;
graph.span(true, u, v);
}
TopologicalSort<> ts(graph);
for (int v : ts.vs) std::cout << v << "\n";
return 0;
}