Advertisement
Guest User

Untitled

a guest
Apr 13th, 2018
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. #include <bitset>
  4. #include <queue>
  5. #include <cstring>
  6.  
  7. using namespace std;
  8.  
  9. class InputReader
  10. {
  11. public:
  12. static const int BUFF_SIZE = 1 << 17;
  13. FILE *fin;
  14. int bp;
  15. char buff[BUFF_SIZE];
  16. InputReader (const char *file_name)
  17. {
  18. fin = fopen(file_name, "r");
  19. bp = BUFF_SIZE - 1;
  20. }
  21. void adv()
  22. {
  23. if (++bp == BUFF_SIZE)
  24. {
  25. fread(buff, sizeof(char), BUFF_SIZE, fin);
  26. bp = 0;
  27. }
  28. }
  29. InputReader& operator >> (int& num)
  30. {
  31. num = 0;
  32. while (isdigit(buff[bp]) == false)
  33. adv();
  34. while (isdigit(buff[bp]))
  35. {
  36. num = num * 10 + buff[bp] - '0';
  37. adv();
  38. }
  39. return *this;
  40. }
  41. };
  42.  
  43. InputReader fin("feisbuc.in");
  44. ofstream fout("feisbuc.out");
  45.  
  46. const int MAXN = 5005;
  47.  
  48. int maxim, minim = 0;
  49.  
  50. int r[MAXN], aux[MAXN], z = 0;
  51.  
  52. bitset < MAXN > viz;
  53. vector < int > v[MAXN];
  54.  
  55. int minval[MAXN], cnt;
  56.  
  57. void dfs(int nod)
  58. {
  59. viz[nod] = 1;
  60. for (auto &it : v[nod])
  61. {
  62. if (!viz[it])
  63. {
  64. r[it] = cnt;
  65. dfs(it);
  66. }
  67. }
  68. }
  69.  
  70. queue < int > Q;
  71.  
  72. int dist[MAXN];
  73. int ok;
  74.  
  75. void bfs()
  76. {
  77. int nod;
  78. while (!Q.empty())
  79. {
  80. nod = Q.front();
  81. Q.pop();
  82. for (auto &it : v[nod])
  83. {
  84. if (dist[it] == -1)
  85. {
  86. Q.push(it);
  87. dist[it] = dist[nod] + 1;
  88. aux[++z] = it;
  89. if (dist[it] > minval[r[it]])
  90. {
  91. ok = 0;
  92. while (!Q.empty()) Q.pop();
  93. return;
  94. }
  95. }
  96. }
  97. }
  98. }
  99.  
  100. int main()
  101. {
  102. int n, m, i, x, y, j;
  103. memset(minval, 1000000, sizeof minval);
  104. memset(dist, -1, sizeof dist);
  105. fin >> n >> m;
  106. for (i = 1; i <= m; ++i)
  107. {
  108. fin >> x >> y;
  109. v[x].push_back(y);
  110. v[y].push_back(x);
  111. }
  112. for (i = 1; i <= n; ++i)
  113. {
  114. if (!viz[i])
  115. {
  116. ++cnt;
  117. r[i] = cnt;
  118. dfs(i);
  119. }
  120. }
  121. for (i = 1; i <= n; ++i)
  122. {
  123. ok = 1;
  124. Q.push(i);
  125. maxim = 0;
  126. dist[i] = 0;
  127. aux[++z] = i;
  128. bfs();
  129. if (!ok)
  130. {
  131. for (j = 1; j <= z; ++j)
  132. {
  133. dist[aux[j]] = -1;
  134. }
  135. z = 0;
  136. continue;
  137. }
  138. for (j = 1; j <= z; ++j)
  139. {
  140. if (dist[aux[j]] > maxim) maxim = dist[aux[j]];
  141. dist[aux[j]] = -1;
  142. }
  143. if (minval[r[i]] > maxim) minval[r[i]] = maxim;
  144. z = 0;
  145. }
  146. for (i = 1; i <= cnt; ++i)
  147. {
  148. if (minval[r[i]] > minim) minim = minval[r[i]];
  149. }
  150. fout << cnt << ' ' << ++minim << '\n';
  151. return 0;
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement