Advertisement
Guest User

Untitled

a guest
May 26th, 2015
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. bool had_circle(const vector<vector<int>>&, vector<char>&, int);
  8. bool t_sort(const vector<vector<int>>&, vector<int>&, vector<char>&, int);
  9. void find_strong_linked_components(const vector<vector<int>>&, vector<int>&, vector<char>& used, int);
  10.  
  11. int main() {
  12. int n, m;
  13. cin >> n >> m;
  14. vector<vector<int>> g(n), gt(n);
  15. int u, v;
  16. for(int i = 0; i < m; i++) {
  17. cin >> u >> v;
  18. u--;
  19. v--;
  20. g[u].push_back(v);
  21. gt[v].push_back(u);
  22. }
  23.  
  24. bool had_c = false;
  25. vector<char> du(n, 0);
  26. for(int i = 0; i < n; i++)
  27. if(du[i] == 0)
  28. if(had_circle(g, du, i) ) {
  29. had_c = true;
  30. break;
  31. }
  32.  
  33. vector<int> list;
  34. du.assign(n, 0);
  35. for(int i = 0; i < n; i++)
  36. if(du[i] == 0)
  37. t_sort(g, list, du, i);
  38.  
  39. reverse(list.begin(), list.end());
  40.  
  41. if(!had_c) {
  42. cout << "Topological sort: " << endl;
  43. for (auto x: list)
  44. cout << x + 1 << " ";
  45. cout << endl;
  46. } else {
  47. cout << "We have circle" << endl;
  48. }
  49. // find strong linked components
  50. du.assign(n, 0);
  51. vector<int> component;
  52. int count = 0;
  53. for(int i = 0; i < n; i++)
  54. if(du[list[i]] == 0) {
  55. count++;
  56. find_strong_linked_components(gt, component, du, list[i]);
  57. // print component
  58. for(auto x: component)
  59. cout << x + 1 << " ";
  60. cout << endl;
  61. component.clear();
  62. }
  63. cout << "In result We have " << count << " strong linked components" << endl;
  64. return 0;
  65. }
  66.  
  67.  
  68. bool had_circle(const vector<vector<int>>& v, vector<char>& u, int k) {
  69. u[k] = 1;
  70. for(auto x: v[k])
  71. if(u[x] == 1)
  72. return true;
  73. else if(u[x] == 0)
  74. return had_circle(v, u, x);
  75. u[k] = 2;
  76. return false;
  77. }
  78.  
  79. bool t_sort(const vector<vector<int>>& v, vector<int>& l, vector<char>& used, int k) {
  80. used[k] = 1;
  81. for(auto x: v[k])
  82. if(used[x] == 0)
  83. t_sort(v, l, used, x);
  84. l.push_back(k);
  85. }
  86.  
  87. void find_strong_linked_components(const vector<vector<int>>& v, vector<int>& l, vector<char>& used, int k) {
  88. used[k] = 1;
  89. l.push_back(k);
  90. for(auto x: v[k])
  91. if(used[x] == 0)
  92. find_strong_linked_components(v, l, used, x);
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement