RT ,可能犯了sb错误,请大佬轻喷
#include <iostream>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
#define MAX_N 200010
struct tree{
vector<int> next;
vector<int> nextw1;
vector<int> nextw2;
}node[MAX_N];
int n;
int d[MAX_N],f[MAX_N][21],disw1[MAX_N][21],disw2[MAX_N][21];
int num[MAX_N],ans[MAX_N];
void bfs(int v){
queue<int> q;
d[v] = 1;
q.push(v);
int t = (int)(log(n) / log(2)) + 1;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = 0;i < node[u].next.size();i++){
int y = node[u].next[i];
if(d[y] != 0)continue;
d[y] = d[u] + 1;
f[y][0] = u;
int w1 = node[u].nextw1[i];
int w2 = node[u].nextw2[i];
disw1[y][0] = w1;
disw2[y][0] = w2;
for(int j = 1;j <= t;j++)
f[y][j] = f[f[y][j-1]][j-1];
q.push(y);
}
}
}
int LCA(int x,int y){
int t = (int)(log(n) / log(2)) + 1;
if(d[x] > d[y])
swap(x,y);
for(int i = t;i >= 0;i--)
if(d[f[y][i]] >= d[x])
y = f[y][i];
if(x == y)return x;
for(int i = t;i >= 0;i--)
if(f[y][i] != f[x][i])
y = f[y][i],x = f[x][i];
return f[x][0];
}
int dfs(int now,int fa){
ans[now] += num[now];
for(int i = 0;i < node[now].next.size();i++){
int y = node[now].next[i];
if(fa != y)
ans[now] += dfs(y,now);
}
return ans[now];
}
int main()
{
cin >> n;
for(int i = 1;i < n;i++){
int u,v,w1,w2;
cin >> u >> v >> w1 >> w2;
node[u].next.push_back(v);
node[u].nextw1.push_back(w1);
node[u].nextw2.push_back(w2);
node[v].next.push_back(u);
node[v].nextw1.push_back(w1);
node[v].nextw2.push_back(w2);
}
bfs(1);
for(int i = 2;i <= n;i++){
int u = i - 1,v = i;
int z = LCA(u,v);
num[u] += 1;
num[v] += 1;
num[z] -= 2;
}
dfs(1,-1);
int min_ans = 0;
for(int i = 2;i <= n;i++){
int w1 = disw1[i][0];
int w2 = disw2[i][0];
int t = ans[i];
min_ans += min(w1 * t,w2);
}
cout << min_ans << endl;
return 0;
}