#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<pair<int,int>>adj[100005];
vector<pair<int,int>>edge;
int val[100005];
int p[20][100005];
int lv[100005];
int freq[100005];
int eid[100005];
int lca(int a,int b){
if(lv[b]>lv[a])swap(a,b);
for(int i=19;i>=0;i--)if(lv[p[i][a]]>=lv[b])a=p[i][a];
if(a==b)return a;
for(int i=19;i>=0;i--)if(p[i][a]!=p[i][b])a=p[i][a],b=p[i][b];
return p[0][a];
}
void dfs(int u,int pa){
p[0][u]=pa;
lv[u]=lv[pa]+1;
for(int i=1;i<20;i++)p[i][u]=p[i-1][p[i-1][u]];
for(auto x:adj[u])if(x.first!=pa){
dfs(x.first,u);
eid[x.first]=x.second;
}
}
void efs(int u,int pa){
for(auto x:adj[u])if(x.first!=pa){
efs(x.first,u);
val[u]+=val[x.first];
}
//cerr<<"u:"<<u<<" "<<val[u]<<"\n";
if(u!=1)freq[eid[u]]=val[u];
}
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n;cin>>n;
for(int i=0;i<n-1;i++){
int a,b,c,d;cin>>a>>b>>c>>d;
adj[a].push_back({b,i});
adj[b].push_back({a,i});
edge.push_back({c,d});
}
dfs(1,0);
for(int i=1;i<n;i++){
int x=lca(i,i+1);
val[x]-=2;
val[i]++;
val[i+1]++;
}
efs(1,0);
int ans=0;
for(int i=0;i<n;i++){
int mn=min(edge[i].second,edge[i].first*freq[i]);
ans+=mn;
}
cout<<ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |