fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. vector<int> topo(vector<vector<int>> &adj){
  5. vector<int> indegree(adj.size(), 0);
  6.  
  7. for (int i = 0; i < (int)adj.size(); i++) {
  8. for (auto j : adj[i]) {
  9. indegree[j]++;
  10. }
  11. }
  12.  
  13. priority_queue<int, vector<int>, greater<int>> ready;
  14. for (int i = 0; i < (int)adj.size(); i++) {
  15. if (indegree[i] == 0) {
  16. ready.push(i);
  17. }
  18. }
  19.  
  20. vector<int> topo_sort;
  21. while (!ready.empty()) {
  22. int node = ready.top();
  23. ready.pop();
  24. topo_sort.push_back(node);
  25.  
  26. for (auto i : adj[node]) {
  27. indegree[i]--;
  28. if (indegree[i] == 0) {
  29. ready.push(i);
  30. }
  31. }
  32. }
  33.  
  34. return topo_sort;
  35. }
  36.  
  37. void solve() {
  38. int n, e;
  39. cin >> n >> e;
  40. vector<vector<int>> adj(n+1);
  41.  
  42. for (int i = 0; i < e; i++) {
  43. int from, to;
  44. cin >> from >> to;
  45. adj[from].push_back(to);
  46. }
  47.  
  48. vector<int> ans = topo(adj);
  49.  
  50. if (ans.size() != n+1) {
  51. cout << "The graph has a cycle\n";
  52. return;
  53. }
  54.  
  55. for (int i = 0; i <(int) ans.size(); i++) {
  56. cout << ans[i];
  57. if (i != ans.size() - 1) {
  58. cout << "->";
  59. }
  60. }
  61. cout << "\n";
  62. }
  63.  
  64. int main() {
  65. solve();
  66. return 0;
  67. }
Success #stdin #stdout 0.01s 5300KB
stdin
8 9
5 0
5 7
6 7
0 1
7 2
8 2
2 4
2 3
6 8
stdout
5->0->1->6->7->8->2->3->4