Guest User

Untitled

a guest
Oct 28th, 2019
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.83 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long int
  4. int in=-1;
  5. int n, m;
  6. vector<vector<int> > edges;
  7. vector<int> dp, tin, parent;
  8. vector<int> cnt;
  9. int tt = 0, ans = 0, total;
  10. vector<bool> vis;
  11. vector<bool> cond;
  12. int diam = 0;
  13. void df(int u,int par=-1)
  14. {
  15. vis[u]=true;
  16. for(ll v : edges[u])
  17. {
  18. if(!vis[v])
  19. df(v,u);
  20. else if(v!=par && vis[v])
  21. in=v;
  22. }
  23. }
  24.  
  25. void dfs(int u, int par = -1){
  26. tin[u] = tt++;
  27. vis[u] = true;
  28. for(auto v : edges[u]){
  29. if(v == par) continue;
  30. if(!vis[v]){
  31. dfs(v, u);
  32. dp[u] += dp[v];
  33. }
  34. else if(tin[v]<tin[u]) dp[u]++, cond[u] = false;
  35. else if(tin[v] > tin[u]) dp[u]--, cond[u] = false;
  36. cond[u]= cond[u] & cond[v];
  37. }
  38. if(dp[u] != 0 or par == -1) cond[u] = false;
  39. if(!cond[u]) return;
  40.  
  41. for(auto v : edges[u]){
  42. if(v == par) continue;
  43. parent[v] = u;
  44. }
  45. parent[u] = u;
  46. }
  47.  
  48. int coun;
  49. void process(int u, int par = -1){
  50. vis[u] = true;
  51. int high = 0, s_high = 0;
  52. for(auto v : edges[u]){
  53.  
  54. if(parent[v] == -1) continue;
  55. if(!vis[v]){
  56. process(v);
  57. int tmp = cnt[v] + (dp[v] == 0);
  58. // cout << u << ":" << v << " " << tmp << "\n";
  59. total += (dp[v] == 0);
  60. if(high <= tmp) s_high = high, high = tmp;
  61. else if(tmp >= s_high) s_high = tmp;
  62. cnt[u] = max(cnt[u], tmp);
  63. }
  64. }
  65. coun++;
  66. diam = max(diam, high + s_high);
  67. }
  68.  
  69. int main()
  70. {
  71. #ifndef ONLINE_JUDGE
  72. freopen("input.txt", "r", stdin);
  73. // freopen("output.txt","w", stdout);
  74. #endif
  75. edges.clear();
  76. cin >> n >> m;
  77. edges.resize(n+1);
  78. dp.clear();
  79. dp.resize(n+1, 0);
  80. tin.clear();
  81. tin.resize(n+1);
  82. vis.clear();
  83. vis.resize(n+10, false);
  84. cnt.clear();
  85. cnt.resize(n+1, 0);
  86. int u, v;
  87. for(int i = 0; i < m; i++) {
  88. cin >> u >> v;
  89. edges[u].push_back(v);
  90. edges[v].push_back(u);
  91. }
  92. df(1);
  93. vis.clear();
  94. vis.resize(n+1, false);
  95. if(in==-1)
  96. cout<<n;
  97. else
  98. {
  99. cond.resize(n+1, true);
  100. parent.resize(n+1, -1);
  101. dfs(in,-1);
  102. diam = 0;
  103. int cur = 0, tmp = 0;
  104. vis.clear();
  105. vis.resize(n+1, false);
  106. for(int i = 1; i <= n; i++){
  107. if(parent[i] == i and dp[i] == 0){
  108. diam = 0;
  109. coun = 0;
  110. process(i);
  111. if(diam >= cur) cur = diam, tmp = coun;
  112. }
  113. }
  114. cout << tmp << "\n";
  115. }
  116.  
  117. }
Add Comment
Please, Sign In to add comment