제출 #111867

#제출 시각아이디문제언어결과실행 시간메모리
111867square1001철인 이종 경기 (APIO18_duathlon)C++14
31 / 100
204 ms19320 KiB
#include <vector> #include <iostream> #include <algorithm> #include <functional> using namespace std; int main() { int N, M; cin >> N >> M; vector<vector<int> > G(N); for(int i = 0; i < M; ++i) { int a, b; cin >> a >> b; --a, --b; G[a].push_back(b); G[b].push_back(a); } vector<int> C(N), P(N), R(N); vector<bool> vis(N), cycle(N); int total = 0, comp = 0; function<void(int, int, int)> dfs = [&](int pos, int pre, int root) { P[pos] = pre; C[pos] = 1; R[pos] = root; vis[pos] = true; ++comp; for(int i : G[pos]) { ++total; if(vis[i]) continue; dfs(i, pos, root); C[pos] += C[i]; } }; for(int i = 0; i < N; ++i) { if(C[i] == 0) { total = 0, comp = 0; dfs(i, -1, i); if(comp * 2 == total) { cycle[i] = true; } } } long long ans = 0; for(int i = 0; i < N; ++i) { int rem = C[R[i]] - 1; long long sum = 1LL * rem * (rem - 1); if(!cycle[R[i]]) { for(int j : G[i]) { if(j == P[i]) continue; rem -= C[j]; sum -= 1LL * C[j] * (C[j] - 1); } sum -= 1LL * rem * (rem - 1); } ans += sum; } cout << ans << endl; return 0; }
#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...