【AtCoder】경프전형 039 Tree Distance
문제
스스로 생각해도 몰랐습니다만, 전형적인 문제이므로 해설 AC했습니다.
해법
모든 정점끼리의 최단 경로를 구하려고 하면 TLE가 됩니다.
거기서, 각각의 변을 통과하는 정점의 조합은 몇 가지인가? 생각합니다.
위의 빨간 변의 경우
(1, 2), (1, 3), (1, 4), (5, 2), (5, 3), (5, 4)
6 거리.
이 조합을 빠르게 계산하는 것을 고려하면 위와 같이 변 앞과 맞은편으로 그룹을 나누면 좋은 것을 알 수 있습니다.
각각의 그룹으로부터 요소를 하나씩 선택하는 경우의 수가, 변을 통과하는 정점의 조합이 됩니다.
위의 예에서 3*2=6
DFS 구현
나무를 탐색할 때는 깊이 우선 탐색(DFS)을 사용하면 좋은 것이 많습니다.
이 경우에는 각 요소가 자식 요소를 몇 개 가지고 있는지 묻고 싶기 때문에 돌아가서 자식 요소의 수를 회수하도록 구현합니다.
// Nは木の要素数
void dfs(int pos, int pre, vector<long long> &dp, vector<vector<long long>> &tree, long long &ans, long long N) {
dp[pos] = 1; // 自分
for (auto n : tree[pos]) {
if (n == pre) continue; // 逆流防止
dfs(n, pos, dp, tree, ans, N);
// ここより下は帰りがけに通る。
dp[pos] += dp[n]; // 子要素の数を回収
}
ans += dp[pos] * (N - dp[pos]); // (自分 + 子要素) * それ以外の要素
}
경쟁 프로 전형적인 90 질문에 대해
AtCoder에서의 실력 업을 목표로하자! ~경전전형 90문~
Reference
이 문제에 관하여(【AtCoder】경프전형 039 Tree Distance), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nizi24/items/98048cd07ab370435081텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)