一看这么简单个题本来想水过,没想到出现了这么大的问题:
#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0;
char c=getchar();
while(c>'9'||c<'0'){
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c-'0');
c=getchar();
}
return x;
}
struct line{
int to;
long long ct1;
long long ct2;
};
int n;
int a,b;
long long c1,c2;
long long ans;
long long p[200001];
vector<line>g[200001];
int f[200001][19];
int dep[200001];
void dfs(int now,int fa){
dep[now]=dep[fa]+1;
f[now][0]=fa;
for(int i=1;i<=18;i++){
f[now][i]=f[f[now][i-1]][i-1];
}
for(int i=0;i<g[now].size();i++){
if(g[now][i].to==fa)continue;
dfs(g[now][i].to,now);
}
}
int lca(int u,int v){
if(dep[u]<dep[v])swap(u,v);
for(int i=18;i>=0;i--){
if(f[u][i]&&dep[f[u][i]]>=dep[v]){
u=f[u][i];
}
}
if(u==v)return u;
for(int i=18;i>=0;i--){
if((f[u][i]&&f[v][i])&&f[u][i]!=f[v][i]){
u=f[u][i];
v=f[v][i];
}
}
return f[u][0];
}
void work(int now){
int fa;
for(int i=0;i<g[now].size();i++){
if(g[now][i].to!=f[now][0]){
work(g[now][i].to);
p[now]+=p[g[now][i].to];
}else{
fa=f[now][0];
}
}
if(g[now][fa].ct1 * p[now] < g[now][fa].ct2) ans+=g[now][fa].ct1 * p[now];
else ans+=g[now][fa].ct2;
cout<<g[now][fa].ct1<<endl;
// printf("%lld\n" , g[now][fa].cost1);
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
cin>>a>>b>>c1>>c2;
g[a].push_back({b,c1,c2});
g[b].push_back({a,c1,c2});
// cout<<g[b].back().cost1<<endl;
}
dfs(1,0);
for(int i=1;i<n;i++){
p[i]++;
p[i+1]++;
p[lca(i,i+1)]-=2;
}
work(1);
for(int i=1;i<=n;i++){
// cout<<p[i];
}
cout<<ans;
return 0;
}