DuongNhi99

SAFENET2 (SongLienThong)

Dec 25th, 2020 (edited)
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. //Thành phần song liên thông
  2. #include <bits/stdc++.h>
  3. #define int64_t long long
  4. using namespace std;
  5.  
  6. const int N = 100005;
  7.  
  8. int n, m;
  9. vector<int> graph[N];
  10.  
  11. int cnt = 0;
  12. int Low[N], Visited[N];
  13. stack<int> st;
  14. int Parent[N], Last[N];
  15. int Count = 0, Ans;
  16.  
  17. bool minimize(int &a, int b) { if(a > b) a = b; else return false; return true; }
  18. bool maximize(int &a, int b) { if(a < b) a = b; else return false; return true; }
  19.  
  20. void visit(int u) {
  21.    Low[u] = Visited[u] = ++cnt;
  22.  
  23.    for(int i = 0, v; v = graph[u][i]; ++i) {
  24.       if(Visited[v])
  25.          minimize(Low[u], Visited[v]);
  26.       else {
  27.          st.push(u);
  28.          Parent[v] = u;
  29.          visit(v);
  30.          minimize(Low[u], Low[v]);
  31.  
  32.          if(Low[v] >= Visited[u]) {
  33.             int Current = 0;
  34.             Count++;
  35.             do {
  36.                v = st.top();
  37.                st.pop();
  38.  
  39.                if(maximize(Last[v], Count))
  40.                   Current++;
  41.             } while(u != v);
  42.  
  43.             maximize(Ans, Current);
  44.          }
  45.       }
  46.    }
  47.    st.push(u);
  48. }
  49.  
  50. int main(){
  51. #ifdef LOCAL
  52.    freopen("in.txt", "r", stdin);
  53. #else
  54.    freopen("SAFENET2.inp", "r", stdin);
  55.    freopen("SAFENET2.out", "w", stdout);
  56. #endif
  57.    ios_base::sync_with_stdio(false);
  58.    cin.tie(0); cout.tie(0);
  59.  
  60.    cin >> n >> m;
  61.    for(int i = 1; i <= m; i++){
  62.       int u, v; cin >> u >> v;
  63.       graph[u].push_back(v);
  64.       graph[v].push_back(u);
  65.    }
  66.  
  67.    for(int i = 1; i <= n; i++)
  68.       graph[i].push_back(0);
  69.  
  70.    for(int i = 1; i <= n; i++)
  71.       if(!Visited[i]) visit(i);
  72.  
  73.    cout << max(Ans, 1) << '\n';
  74.  
  75.    return 0;
  76. }
  77.  
Add Comment
Please, Sign In to add comment