fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n,m;
  4. vector<vector<int>> inp;
  5. vector<int> low, num, dp;
  6. vector<bool> vis;
  7. int times = 0;
  8. int ans_cur = 0;
  9. void dfs(int u, int par)
  10. {
  11. low[u] = num[u] = ++times;
  12. int child = 1;
  13. int mx = 0;
  14. for(int x: inp[u])
  15. {
  16. if(x == par) continue;
  17.  
  18. if(num[x] == 0)
  19. {
  20. dfs(x, u);
  21. child++;
  22. low[u] = min(low[u], low[x]);
  23.  
  24. if(low[x] == num[x])
  25. {
  26. mx = max(mx, dp[x] +1);
  27. }
  28.  
  29. }
  30. else if(num[x] < num[u]) low[u] = min(low[u], num[x]);
  31. }
  32. dp[u] = mx;
  33. }
  34.  
  35.  
  36. void dfs_vis(int u, int par)
  37. {
  38. int child = 0;
  39. vis[u] = true;
  40. int mx = 0;
  41. int mx2 = 0;
  42. for(int x: inp[u])
  43. {
  44. if(vis[x]) continue;
  45. dfs_vis(x, u);
  46. child++;
  47. bool tmp = false;
  48. if( low[x] == num[x]) { tmp = true; }
  49. if(mx < dp[x] + tmp)
  50. {
  51. mx2 =mx;
  52. mx = dp[x] + tmp;
  53.  
  54. }
  55. else if( mx2 < dp[x] + tmp && mx >= dp[x] + tmp)
  56. {
  57. mx2 = dp[x] + tmp;
  58. }
  59. }
  60.  
  61. ans_cur = max(ans_cur, mx + mx2);
  62. }
  63. int main()
  64. {
  65. ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  66. cin >> n >>m;
  67. inp.resize(n+1);
  68. low.resize(n+1);
  69. num.resize(n+1);
  70. dp.resize(n+1);
  71. for(int i =1; i<=m; i++)
  72. {
  73. int a,b; cin >> a >> b;
  74. inp[a].push_back(b);
  75. inp[b].push_back(a);
  76. }
  77.  
  78. for(int i =1;i<=n; i++) if(num[i] == 0) dfs(i, i);
  79. vis.resize(n+1);
  80. int ans = 0;
  81. for(int i =1; i<=n; i++)
  82. {
  83. if(vis[i] == false)
  84. {
  85. dfs_vis(i, i);
  86. ans = max(ans, ans_cur);
  87. ans_cur = 0;
  88. }
  89. }
  90. cout << ans;
  91. return 0;
  92. }
Success #stdin #stdout 0s 5320KB
stdin
7 10
4 5
3 7
6 2
3 4
1 6
7 4
2 7
3 2
2 5
5 6
stdout
1