Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Make CSP great again
- #include <bits/stdc++.h>
- #define TASK "TESTCODE"
- using namespace std;
- const int N = 1e5;
- multiset<int> Adj1[N + 1];
- int n, m, Low[N + 1], Num[N + 1], Count(0), Component[N + 1], d[N + 1], ComponentCount(0), res = 0, p, check;
- bool Free[N + 1], Visited[N + 1];
- stack<int> Stack;
- vector<int> Adj[N + 1], tmp;
- void read()
- {
- cin >> n >> m;
- for (int i = 1; i <= m; ++ i)
- {
- int u, v;
- cin >> u >> v;
- Adj1[u].insert(v);
- Adj1[v].insert(u);
- Adj[u].push_back(v);
- Adj[v].push_back(u);
- }
- fill(Free + 1, Free + n + 1, true);
- fill(Visited + 1, Visited + n + 1, false);
- }
- void Visit(int u)
- {
- ++Count;
- Low[u] = Num[u] = Count;
- Stack.push(u);
- for (int v : Adj1[u])
- {
- if (Free[v])
- {
- if (Num[v] != 0)
- {
- Low[u] = min(Low[u], Num[v]);
- }
- else
- {
- auto it = Adj1[v].find(u);
- Adj1[v].erase(it);
- Visit(v);
- Low[u] = min(Low[u], Low[v]);
- }
- }
- }
- if (Low[u] == Num[u])
- {
- ++ComponentCount;
- int v;
- do
- {
- v = Stack.top();
- Stack.pop();
- Component[v] = ComponentCount;
- Free[v] = false;
- }
- while (v != u);
- }
- }
- void DFS(int u)
- {
- if (d[u] > check)
- {
- check = d[u];
- p = u;
- }
- tmp.push_back(u);
- for (int v : Adj[u])
- {
- if (!Visited[v])
- {
- int add = 0;
- if (Component[v] != Component[u])
- {
- add = 1;
- }
- d[v] = d[u] + add;
- Visited[v] = true;
- DFS(v);
- }
- }
- }
- void Get(int u)
- {
- tmp.clear();
- check = 0;
- p = -1;
- Visited[u] = true;
- DFS(u);
- if (p != -1)
- {
- check = 0;
- for (int i : tmp)
- {
- d[i] = 0;
- Visited[i] = false;
- }
- Visited[p] = true;
- DFS(p);
- res = max(res, check);
- }
- }
- void solve()
- {
- for (int i = 1; i <= n; ++ i)
- {
- if (Num[i] == 0)
- {
- Visit(i);
- }
- }
- for (int i = 1; i <= n; ++ i)
- {
- if (!Visited[i])
- {
- Get(i);
- }
- }
- cout << res;
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- //freopen(TASK".INP", "r", stdin);
- //freopen(TASK".OUT", "w", stdout);
- int t = 1;
- bool typetest = false;
- if (typetest)
- {
- cin >> t;
- }
- for (int __ = 1; __ <= t; ++ __)
- {
- read();
- solve();
- }
- }
Add Comment
Please, Sign In to add comment