到底哪错了啊
查看原帖
到底哪错了啊
833124
BIOS楼主2023/6/6 23:53
#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;
}

过了六成的数据吧,看讨论区看题解,跟我这个意思不都差不多吗?为什么我的输出有时候会偏多呢

2023/6/6 23:53
加载中...