fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n,m;
  4. struct Node
  5. {
  6. int v;
  7. int id;
  8. };
  9. vector<vector<Node>> inp;
  10. vector<int> low, num;
  11. vector<bool>joint;
  12. vector<bool> vis;
  13. vector<int>dp;
  14. stack<pair<int, int>> st;
  15. int times = 0;
  16. int ans = 0;
  17. void dfs(int u, int par)
  18. {
  19. low[u] = num[u] = ++times;
  20. int child = 0;
  21. unordered_set<int> sett;
  22. for(Node v: inp[u])
  23. {
  24. int x = v.v;
  25. int id = v.id;
  26. int minx = min(u, x);
  27. int maxx = max(u, x);
  28. if(id == par) continue;
  29. if(num[x] == 0)
  30. {
  31. st.push({minx, maxx});
  32. dfs(x, id);
  33.  
  34. low[u] = min(low[u], low[x]);
  35. child++;
  36. if(low[x] >= num[u])
  37. {
  38.  
  39. while(st.top().first != minx || st.top().second != maxx)
  40. {
  41.  
  42. sett.insert(st.top().first);
  43. sett.insert(st.top().second);
  44. st.pop();
  45. }
  46. st.pop();
  47. ans = max(ans, (int)sett.size());
  48. }
  49. }
  50. else if(num[x] < num[u]) { st.push({minx, maxx}); low[u] = min(low[u], num[x]); }
  51. }
  52. return;
  53. }
  54.  
  55.  
  56. int main()
  57. {
  58. ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  59. cin >> n >> m;
  60. inp.resize(n+1);
  61. low.resize(n+1);
  62. num.resize(n+1);
  63. joint.resize(n+1);
  64. for(int i =1; i<=m; i++)
  65. {
  66. int a,b; cin >> a >> b;
  67. inp[a].push_back({b, i});
  68. inp[b].push_back({a, i});
  69. }
  70.  
  71. for(int i =1; i<=n; i++) if(num[i] == 0) dfs(i, -1);
  72. cout << ans;
  73.  
  74. return 0;
  75. }
Success #stdin #stdout 0.01s 5288KB
stdin
13 12
1 12
3 4
4 13
4 6
12 13
8 13
6 13
1 13
5 10
5 6
6 10
4 8
stdout
4