Advertisement
Guest User

Erősen összefüggővé alakítás - AK423Q

a guest
Dec 9th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.60 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4.  
  5. using namespace std;
  6.  
  7. int L[10000];
  8. int P[10000];
  9. int index;
  10. bool visited[10000];
  11. vector<int> graph[10000];
  12. vector<int> graphT[10000];
  13.  
  14. void dfs(int node) {
  15. for (int n : graph[node]) {
  16. if (!visited[n]) {
  17. visited[n] = true;
  18. dfs(n);
  19. }
  20. }
  21. L[index--] = node;
  22. }
  23.  
  24. void dfs2(int node) {
  25. for (int n : graphT[node]) {
  26. if (P[n] == -1) {
  27. P[n] = P[node];
  28. dfs2(n);
  29. }
  30. }
  31. }
  32.  
  33. int main() {
  34. int N, M;
  35. cin >> N >> M;
  36. int p, q;
  37. for (int i = 0; i < M; i++) {
  38. cin >> p >> q;
  39. p--;
  40. q--;
  41. graph[p].push_back(q);
  42. graphT[q].push_back(p);
  43. }
  44.  
  45. for (int i = 0; i < N; i++) {
  46. visited[i] = false;
  47. }
  48. index = N - 1;
  49. for (int i = 0; i < N; i++) {
  50. if (!visited[i]) {
  51. visited[i] = true;
  52. dfs(i);
  53. }
  54. }
  55.  
  56. for (int i = 0; i < N; i++) {
  57. P[i] = -1;
  58. }
  59. int ind = 0;
  60. for (int i = 0; i < N; i++) {
  61. if (P[L[i]] == -1) {
  62. P[L[i]] = ind++;
  63. dfs2(L[i]);
  64. }
  65. }
  66.  
  67. if (ind == 1) {
  68. cout << "0 0" << endl;
  69. return 0;
  70. }
  71.  
  72. set<int> in[ind], out[ind];
  73. for (int i = 0; i < N; i++) {
  74. for (int j : graph[i]) {
  75. if (P[i] != P[j]) {
  76. out[P[i]].insert(P[j]);
  77. in[P[j]].insert(P[i]);
  78. }
  79. }
  80. }
  81. int good_in, good_out;
  82. for (int i = 0; i < ind; i++) {
  83. if (in[i].size() == 0) {
  84. good_in = i;
  85. }
  86. if (out[i].size() == 0) {
  87. good_out = i;
  88. }
  89. }
  90. int node_in, node_out;
  91. for (int i = 0; i < N; i++) {
  92. if (P[i] == good_in) {
  93. node_in = i;
  94. }
  95. if (P[i] == good_out) {
  96. node_out = i;
  97. }
  98. }
  99. cout << node_out + 1 << " " << node_in + 1 << endl;
  100.  
  101. return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement