Submission #166740

#TimeUsernameProblemLanguageResultExecution timeMemory
166740combi1k1Duathlon (APIO18_duathlon)C++14
100 / 100
321 ms29016 KiB
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 1; vector<int> g[N]; vector<int> a[N + N]; void addEdge(int u,int v) { a[u].push_back(v); a[v].push_back(u); //cerr << u << " " << v << "\n"; } int dfn[N], low[N]; int nCh[N + N]; int tot, siz; int ver = N; long long ans = 0; stack<int> st; void dfs(int u,int p) { siz++; tot++; dfn[u] = tot; low[u] = tot; st.push(u); for(int v : g[u]) if (v != p) { if (dfn[v]) low[u] = min(low[u],dfn[v]); if(!dfn[v]) { dfs(v,u); low[u] = min(low[u],low[v]); if (low[v] >= dfn[u]) { ver++; addEdge(u,ver); int z; do { z = st.top(); st.pop(); addEdge(z,ver); } while (z != v); } } } } void cal(int u,int p) { if (u < N) nCh[u] = 1; for(int v : a[u]) if (v != p) { cal(v,u); nCh[u] += nCh[v]; } if (u < N) return; for(int v : a[u]) { int T_T; if (v != p) T_T = nCh[v]; else T_T = siz - nCh[u]; ans -= 1ll * T_T * (T_T - 1) * (a[u].size() - 1); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; int m; cin >> m; for(int i = 0 ; i < m ; ++i) { int x; cin >> x; int y; cin >> y; g[x].push_back(y); g[y].push_back(x); } for(int i = 1 ; i <= n ; ++i) if(!dfn[i]) { siz = 0; dfs(i,0); ans += 1ll * siz * (siz - 1) * (siz - 2); cal(i,0); } cout << ans << endl; } /* 4 4 1 2 2 3 3 4 4 2 */
#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...