제출 #1160957

#제출 시각아이디문제언어결과실행 시간메모리
1160957not_amir철인 이종 경기 (APIO18_duathlon)C++20
100 / 100
127 ms29836 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; vector<int> depth, w; vector<bool> visited, is_root; vector<vector<int>> T; int cnt; stack<int> stk; int dfs1(int v, int p, vector<vector<int>> &G, int d = 0) { visited[v] = true; depth[v] = d; cnt++; stk.push(v); w[v] = -1; int low = d; for (int u : G[v]) { if (visited[u]) { if (u != p) low = min(low, depth[u]); continue; } int curr = dfs1(u, v, G, d + 1); if (curr >= d) { int nn = T.size(); T.push_back({v}); T[v].push_back(nn); w.push_back(1); while (true) { int x = stk.top(); stk.pop(); T[nn].push_back(x); T[x].push_back(nn); w[nn]++; if (x == u) break; } } low = min(low, curr); } return low; } ll ans = 0; ll dfs2(int v, int p, int n) { ll siz = v < visited.size(); for (int u : T[v]) { if (u == p) continue; ll curr = dfs2(u, v, n); ans += siz * curr * w[v]; siz += curr; } ans += (n - siz) * siz * w[v]; return siz; } int main() { cin.tie(nullptr)->sync_with_stdio(false); int n, m; cin >> n >> m; vector<vector<int>> G(n + 1); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } visited.resize(n + 1); depth.resize(n + 1); T.resize(n + 1); w.resize(n + 1); is_root.resize(n + 1); for (int i = 1; i <= n; i++) { if (visited[i]) continue; cnt = 0; dfs1(i, 0, G); dfs2(i, 0, cnt); } cout << 2 * ans << '\n'; } /* 7 6 1 2 2 3 2 4 2 5 5 6 5 7 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...