結果
| 問題 |
No.872 All Tree Path
|
| コンテスト | |
| ユーザー |
kenta255
|
| 提出日時 | 2019-08-30 23:09:28 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 340 ms / 3,000 ms |
| コード長 | 1,852 bytes |
| コンパイル時間 | 2,368 ms |
| コンパイル使用メモリ | 202,000 KB |
| 最終ジャッジ日時 | 2025-01-07 16:03:53 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 18 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define P pair<ll,ll>
#define FOR(I,A,B) for(ll I = ll(A); I < ll(B); ++I)
#define FORR(I,A,B) for(ll I = ll((B)-1); I >= ll(A); --I)
#define TO(x,t,f) ((x)?(t):(f))
#define SORT(x) (sort(x.begin(),x.end())) // 0 2 2 3 4 5 8 9
#define POSL(x,v) (lower_bound(x.begin(),x.end(),v)-x.begin()) //xi>=v x is sorted
#define POSU(x,v) (upper_bound(x.begin(),x.end(),v)-x.begin()) //xi>v x is sorted
#define NUM(x,v) (POSU(x,v)-POSL(x,v)) //x is sorted
#define REV(x) (reverse(x.begin(),x.end())) //reverse
ll gcd(ll a,ll b){if(a%b==0)return b;return gcd(b,a%b);}
ll lcm(ll a,ll b){ll c=gcd(a,b);return ((a/c)*(b/c)*c);}
#define NEXTP(x) next_permutation(x.begin(),x.end())
const ll INF=ll(1e18)+ll(7);
const ll MOD=1000000007LL;
#define out(a) cout<<fixed<<setprecision((a))
vector<ll> tree[200003];
ll ans = 0;
ll N;
ll root = 1;
ll pa[200009]={};
ll numch[200009]={};
bool did[200009];
vector<ll> U,V,W;
void dfs(int i = 1){
did[i] = true;
for(auto ch:tree[i]){
if(did[ch])continue;
pa[ch] = i;
dfs(ch);
}
}
int main(){
cin >> N;
FOR(i,0,N-1){
ll u,v,w;
cin >> u >> v >> w;
tree[u].push_back(v);
tree[v].push_back(u);
U.push_back(u);
V.push_back(v);
W.push_back(w);
}
dfs();
FOR(i,1,N+1) did[i] = false;
vector<ll> dodo;
queue<ll> q;
q.push(1);
did[1] = true;
while(q.size()){
ll ind = q.front();
q.pop();
dodo.push_back(ind);
for(auto nex:tree[ind]){
if(not did[nex]){
did[nex] = true;
q.push(nex);
}
}
}
reverse(dodo.begin(), dodo.end());
//cout << dodo.size() << endl;
ll cnt[N+1] = {};
FOR(i,0,N+1)cnt[i]=1;
for(auto x:dodo){
cnt[pa[x]]+=cnt[x];
}
FOR(i,0,N-1){
ll chai;
if(pa[U[i]]==V[i]){
chai = U[i];
}else{
chai = V[i];
}
ans += W[i] * cnt[chai] * (N-cnt[chai]);
}
cout << ans*2 << endl;
}
kenta255