代码就差最后一步了!求条=一关
查看原帖
代码就差最后一步了!求条=一关
1385996
ZSYhaouuan楼主2024/12/15 16:00

这是源代码:

#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代表两种票的价格。

我是用图的存图方式存的,但就在那里不知道到怎么存价格。

看题解里也没有这种方法存树的。

求大佬修改!!!

2024/12/15 16:00
加载中...