这是源代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 5e5+100;
ll n;
ll dep[N], fa[N][25], dif[N], dis1[N], dis2[N];
vector<ll> G[N];
void dfs(ll u, ll f, ll d) {
dep[u] = d;
fa[u][0] = f;
for (ll i = 1; i <= 20; i++) {
fa[u][i] = fa[fa[u][i - 1]][i - 1];
}
for (auto y : G[u]) {
if (y != f) dfs(y, u, d + 1);
}
return;
}
ll lca(ll x, ll y) {
if (dep[x] < dep[y]) swap(x, y);
for (ll i = 20; i >= 0; i--) {
if (dep[x] - (1 << i) >= dep[y]) x = fa[x][i];
}
if (x == y) return x;
for (ll i = 20; i >= 0; i--) {
if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
}
return fa[x][0];
}
void dfs2(ll u, ll f) {
for (auto y : G[u]) {
if (y != f) dfs2(y, u), dif[u] += dif[y];
}
return;
}
int main() {
cin >> n;
for (ll i = 1; i <= n - 1; i++) {
ll x, y, c, d;
cin >> x >> y >> c >> d;
G[x].push_back(y);
G[y].push_back(x);
dis1[y] = c;
dis2[y] = d;
}
dfs(1, 0, 1);
for (ll i = 1; i <= n - 1; i++) {
ll p = lca(i, i + 1);
dif[i]++;
dif[i + 1]++;
dif[p] -= 2;
}
dfs2(1, 0);
ll ans = 0;
for (ll i = 2; i <= n; i++) {
ans += min(dis1[i] * dif[i], dis2[i]);
//cout<<min(dis1[i]*dif[i],dis2[i])<<" ";
}
cout << ans;
return 0;
}
问题在这里:
dis1[y] = c;
dis2[y] = d;
dis1,dis2代表两种票的价格。
我是用图的存图方式存的,但就在那里不知道到怎么存价格。
看题解里也没有这种方法存树的。
求大佬修改!!!