#include<bits/stdc++.h>
using namespace std;
struct pt{
int t,w1,w2;
};
vector<pt> t[300600];
int fa[300600][35],dep[300600];
long long cnt[300600];
int rd[300600];
long long v1[300600],v2[300600];
bool vis[300600];
long long ans;
void dfs(int f,int xz){
vis[xz]=1;
dep[xz]=dep[f]+1;
fa[xz][0]=f;
for(int i=1;i<=31;i++){
fa[xz][i]=fa[fa[xz][i-1]][i-1];
}
int siz=t[xz].size();
for(int i=0;i<siz;i++){
if(vis[t[xz][i].t]==0){
dfs(xz,t[xz][i].t);
}
}
}
int lca(int l,int r){
if(dep[l]>dep[r]) swap(l,r);//r 深
for(int i=31;i>=0;i--){
if(dep[fa[r][i]]>=dep[l]){
r=fa[r][i];
}
}
for(int i=31;i>=0;i--){
if(fa[l][i]!=fa[r][i]){
l=fa[l][i];
r=fa[r][i];
}
}
return fa[r][0];
}
void cb(int l,int r,int w1,int w2){
int tmp=l;
if(dep[l]<dep[r]) tmp=r;
v1[tmp]=w1;
v2[tmp]=w2;
}
void dfs2(int f,int xz){
vis[xz]=1;
int siz=t[xz].size();
for(int i=0;i<siz;i++){
cb(xz,t[xz][i].t,t[xz][i].w1,t[xz][i].w2);
if(vis[t[xz][i].t]==0){
dfs2(xz,t[xz][i].t);
}
}
cnt[fa[xz][0]]+=cnt[xz];
}
int main(){
int n;
cin>>n;
int a,b,c1,c2;
pt tmp;
for(int i=1;i<n;i++){
cin>>a>>b>>c1>>c2;
tmp.t=b,tmp.w1=c1,tmp.w2=c2;
t[a].push_back(tmp);
tmp.t=a;
t[b].push_back(tmp);
}
dfs(0,1);
for(int i=2;i<=n;i++){
cnt[i]++;
cnt[i-1]++;
cnt[lca(i,i-1)]-=2;
}
memset(vis,0,sizeof(vis));
dfs2(0,1);
for(int i=1;i<=n;i++){
ans+=min(cnt[i]*v1[i],v2[i]);
}
cout<<ans;
return 0;
}
样例倒是全对了,但是wa+ac求大佬帮调