結果
問題 |
No.872 All Tree Path
|
ユーザー |
|
提出日時 | 2019-06-15 02:00:51 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 243 ms / 3,000 ms |
コード長 | 1,058 bytes |
コンパイル時間 | 1,567 ms |
コンパイル使用メモリ | 169,480 KB |
実行使用メモリ | 37,592 KB |
最終ジャッジ日時 | 2024-11-17 18:53:47 |
合計ジャッジ時間 | 4,523 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 18 |
ソースコード
#include <bits/stdc++.h> using namespace std; long long N; vector<vector<pair<int,long long>>> edge; vector<long long> dist,sum,scale; int idx = 0; void dfs1(int from, int prev = -1){ for(int i = 0; i < edge[from].size(); ++i){ int to = edge[from][i].first; if(to==prev) continue; dist[to] = dist[from] + edge[from][i].second; dfs1(to,from); scale[from] += scale[to]; } } void dfs2(int from, int prev = -1){ for(int i = 0; i < edge[from].size(); ++i){ int to = edge[from][i].first; if(to==prev) continue; sum[to] = sum[from] + (N - 2*scale[to])*edge[from][i].second; dfs2(to,from); } } int main() { cin.tie(0); ios::sync_with_stdio(false); cin >> N; edge.resize(N); dist.resize(N); sum.resize(N); scale.resize(N,1); for(int i = 0; i < N-1; ++i){ int u,v; long long w; cin >> u >> v >> w; u--,v--; edge[u].push_back({v,w}); edge[v].push_back({u,w}); } dist[0] = 0; dfs1(0); sum[0] = accumulate(dist.begin(),dist.end(),0LL); dfs2(0); cout << accumulate(sum.begin(),sum.end(),0LL) << endl; return 0; }