#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
#define int long long
const int N = 2e5 + 5, M = 4e5 + 5, INF = 1e18;
int h[N], de[N], w1[M], ne[M], e[M], w2[M], d[N], w[N], idx, a, b, n, c, D, res, fa[N][21];
void add(int a, int b, int c, int d)
{
e[idx] = b, ne[idx] = h[a], w1[idx] = c, w2[idx] = d, h[a] = idx++;
}
void bfs()
{
queue<int> q;
for (int i = 0; i < N; i++)
de[i] = INF;
d[0] = 0, de[1] = 1;
q.push(1);
while (q.size())
{
int t = q.front();
q.pop();
for (int i = h[t]; ~i; i = ne[i])
{
int j = e[i];
if (de[j] > de[t] + 1)
{
de[j] = de[t] + 1, q.push(j), fa[j][0] = t;
for (int k = 1; k <= 20; k++)
fa[j][k] = fa[fa[j][k - 1]][k - 1];
}
}
}
}
int lca(int a, int b)
{
if (de[a] < de[b])
swap(a, b);
for (int k = 20; k >= 0; k--)
if (de[fa[a][k]] >= de[b])
a = fa[a][k];
if (a == b)
return a;
for (int k = 20; k >= 0; k--)
if (fa[a][k] != fa[b][k])
a = fa[a][k], b = fa[b][k];
return fa[a][0];
}
void dfs(int u, int father)
{
for (int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
if (j == father)
continue;
dfs(j, u);
w[u] += min(d[j] * w1[i], w2[i]), d[u] += d[j];
}
res += w[u];
}
signed main()
{
ios::sync_with_stdio;
cin.tie(0);
memset(h, -1, sizeof(h));
cin >> n;
for (int i = 1; i < n; i++)
cin >> a >> b >> c >> D, add(a, b, c, D), add(b, a, c, D);
bfs();
for (int i = 1; i < n; i++)
{
d[i]++, d[i + 1]++;
int p = lca(i, i + 1);
d[p] -= 2;
}
dfs(1, -1);
cout << res << endl;
}
过了六成的数据吧,看讨论区看题解,跟我这个意思不都差不多吗?为什么我的输出有时候会偏多呢