Advertisement
Guest User

Untitled

a guest
Feb 18th, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. //https://www.e-olymp.com/ru/problems/4371
  2.  
  3. #pragma GCC optimize ("O3")
  4.  
  5. #include <iostream>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <stdio.h>
  9. #include <cstring>
  10. #include <string>
  11. #include <cstdlib>
  12. #include <vector>
  13. #include <bitset>
  14. #include <map>
  15. #include <chrono>
  16. #include <unordered_set>
  17. #include <unordered_map>
  18. #include <numeric>
  19. #include <queue>
  20. #include <ctime>
  21. #include <stack>
  22. #include <set>
  23. #include <list>
  24. #include <deque>
  25. #include <iomanip>
  26. #include <sstream>
  27. #include <fstream>
  28. #include <stdarg.h>
  29. #include <utility>
  30.  
  31. #define MAXN 1000000
  32. #define MOD 10000000000
  33. #define LOCAL
  34.  
  35. using namespace std;
  36.  
  37. vector <int> g[100001];
  38. int parent[100001] = {0};
  39. int rankk[100001];
  40.  
  41.  
  42. queue <int> q;
  43. int top[100001] = {0};
  44. int used[100001] = {0};
  45. int d[100001] = {0};
  46. int kol = 0;
  47.  
  48.  
  49. int make_set(int v) {
  50. parent[v] = v;
  51. rankk[v] = 0;
  52. kol++;
  53. return 0;
  54. }
  55.  
  56. int find_set(int v) {
  57. if(v == parent[v])
  58. return v;
  59. return parent[v] = find_set(parent[v]);
  60. }
  61.  
  62. int union_set(int a, int b) {
  63. a = find_set(a);
  64. b = find_set(b);
  65. if(a == b)
  66. return 0;
  67. kol--;
  68. if(rankk[a] < rankk[b])
  69. swap(a, b);
  70. parent[b] = a;
  71. if(rankk[a] == rankk[b])
  72. rank[a]++;
  73. return 0;
  74. }
  75.  
  76. int main() {
  77. int i, j, x, fl, y, k, l, n, m, t, v;
  78. scanf("%i%i%i", &n, &m, &t);
  79. for(i = 1; i <= m; i++) {
  80. scanf("%i%i", &x, &y);
  81. g[x].push_back(y);
  82. g[y].push_back(x);
  83. }
  84. q.push(t);
  85. used[t] = 1;
  86. d[t] = 1;
  87. l = 0;
  88. k = 1;
  89. while(!q.empty()) {
  90. v = q.front();
  91. q.pop();
  92. top[++l] = v;
  93. for(i = 0; i < g[v].size(); i++)
  94. if(!used[g[v][i]]) {
  95. used[g[v][i]] = 1;
  96. d[g[v][i]] = d[v] + 1;
  97. k = d[g[v][i]];
  98. q.push(g[v][i]);
  99. }
  100. }
  101.  
  102. reverse(top+1, top+l+1);
  103.  
  104.  
  105. for(i = 1; i <= n; i++)
  106. if(!used[i]) {
  107. used[i] = 1;
  108. make_set(i);
  109. for(j = 0; j < g[i].size(); j++)
  110. if(used[g[i][j]])
  111. union_set(i, g[i][j]);
  112. }
  113.  
  114. printf("%i\n", k);
  115. l = 1;
  116. vector <int> ans;
  117. memset(used, 0, sizeof(used));
  118. ans.push_back(kol);
  119.  
  120. for(i = k; i >= 1; i--) {
  121. while(l <= n && d[top[l]] == i) {
  122. make_set(top[l]);
  123. used[top[l]] = 1;
  124. for(j = 0; j < g[top[l]].size(); j++)
  125. if(used[g[top[l]][j]])
  126. union_set(top[l], g[top[l]][j]);
  127. l++;
  128. }
  129. ans.push_back(kol);
  130. }
  131. reverse(ans.begin(), ans.end());
  132. for(i = 0; i < ans.size(); i++) {
  133. if(i)
  134. printf(" ");
  135. printf("%i", ans[i]);
  136. }
  137. printf("\n");
  138. getchar();
  139. getchar();
  140.  
  141. return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement