Guest User

Untitled

a guest
Jan 19th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.89 KB | None | 0 0
  1. #include <fstream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <list>
  6.  
  7. using namespace std;
  8.  
  9. ifstream cin("input.txt");
  10. ofstream cout("output.txt");
  11. //ifstream cin(" firesafe.in");
  12. //ofstream cout("firesafe.out");
  13.  
  14.  
  15. vector < list <int> > g, gt, scc;
  16. vector < bool > used;
  17. vector < vector < int > > c;
  18. vector < int > order, res, color;
  19. int n, m;
  20.  
  21. void init(){
  22. used.resize(n);
  23. g.resize(n);
  24. gt.resize(n);
  25. c.resize(n);
  26. color.resize(n);
  27. for (int i = 0; i < n; i++)
  28. c[i].resize(n);
  29. }
  30.  
  31. void dfs(int v){
  32. int j;
  33. list < int >:: iterator it;
  34. used[v] = true;
  35. for (it = g[v].begin(); it != g[v].end(); it++){
  36. j = *it;
  37. if (!used[j])
  38. dfs(j);
  39. }
  40. order.push_back(v);
  41. }
  42.  
  43. void dfs1(int v){
  44. int j;
  45. list < int >:: iterator it;
  46. list < int >:: iterator jt;
  47. used[v] = true;
  48. scc[scc.size() - 1].push_back(v);
  49. for (it = gt[v].begin(); it != gt[v].end(); it++){
  50. j = *it;
  51. if (!used[j])
  52. dfs1(j);
  53. }
  54. }
  55.  
  56. void bingo(int v){
  57. res.push_back(v);
  58. }
  59.  
  60. void dfs2(int v){
  61. used[v] = true;
  62. bool children = false;
  63. for (int i = 0; i < scc.size(); i++)
  64. if (!used[i] && c[scc[v].front()][scc[i].front()] == 1){
  65. dfs2(i);
  66. children = true;
  67. }
  68. if (!children)
  69. bingo(scc[v].front());
  70. }
  71.  
  72. int main() {
  73. cin >> n >> m;
  74. init();
  75. for (int i = 0; i < m; i++){
  76. int v, u;
  77. cin >> v >> u;
  78. g[v - 1].push_back(u - 1);
  79. gt[u - 1].push_back(v - 1);
  80. }
  81. for (int i = 0; i < n; i++)
  82. if (!used[i])
  83. dfs(i);
  84. used.assign(n, false);
  85. for (int i = n - 1; i >= 0; i--)
  86. if (!used[order[i]]){
  87. list < int >:: iterator it;
  88. list < int >:: iterator jt;
  89. scc.resize(scc.size() + 1);
  90. dfs1(order[i]);
  91. for (it = scc[scc.size() - 1].begin(); it != scc[scc.size() - 1].end(); it++)
  92. color[*it] = scc.size();
  93. }
  94. cout << scc.size() << endl;
  95. for (int i = 0; i< n; i++)
  96. cout << color[i] << " ";
  97. return 0;
  98. }
Add Comment
Please, Sign In to add comment