結果
| 問題 |
No.872 All Tree Path
|
| コンテスト | |
| ユーザー |
peroon
|
| 提出日時 | 2019-12-03 01:45:19 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 355 ms / 3,000 ms |
| コード長 | 1,820 bytes |
| コンパイル時間 | 1,522 ms |
| コンパイル使用メモリ | 181,124 KB |
| 実行使用メモリ | 45,388 KB |
| 最終ジャッジ日時 | 2024-11-25 05:05:12 |
| 合計ジャッジ時間 | 5,088 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 18 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using VI = vector<ll>;
using VV = vector<VI>;
using VS = vector<string>;
using PII = pair<ll, ll>;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
#define FOR(i,a,b) for(ll i=(a);i<(b);++i)
#define rep(i,b) FOR(i, 0, b)
#define ALL(v) (v).begin(), (v).end()
#define p(s) cout<<(s)<<'\n'
#define p2(s, t) cout << (s) << " " << (t) << '\n'
#define br() p("")
#define pn(s) cout << (#s) << " " << (s) << '\n'
#define SZ(x) ((int)(x).size())
#define MP make_pair
const ll mod = 1e9 + 7;
const ll inf = 1e18;
const double PI = acos(-1);
struct Edge{
ll to;
ll cost;
Edge(ll to, ll cost): to(to), cost(cost) {}
};
ll ans = 0;
ll N;
vector<vector<Edge>> G;
map<PII, ll> mp; // i, j間のedgeコスト(キーはi<jとする)
// 距離(遅いVER・ナイーブ)
ll dist(ll i, ll j){
for(auto edge : G[i]){
if(edge.to==j) return edge.cost;
}
return -1;
}
ll dist2(ll i, ll j){
if(i>j){
swap(i, j);
}
return mp[MP(i, j)];
}
// i以降のノード数を返す
// (iも含む)
ll dfs(ll i, ll prev){
ll sum = 0;
for(auto edge : G[i]){
if(edge.to==prev) continue;
sum += dfs(edge.to, i);
}
ll a = sum+1;
ll b = N-a;
ll d = dist2(i, prev);
ans += a*b*d;
return sum+1;
}
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
// input
cin >> N;
G.resize(N);
rep(i, N-1){
ll u, v, w;
cin >> u >> v >> w;
u--; v--;
G[u].push_back(Edge(v, w));
G[v].push_back(Edge(u, w));
if(u<v){
mp[MP(u, v)] = w;
}else{
mp[MP(v, u)] = w;
}
}
dfs(0, -1);
p(ans*2);
return 0;
}
peroon