换根DP做法,然而莫名只有70分
查看原帖
换根DP做法,然而莫名只有70分
113932
lxg_honoka楼主2020/9/4 02:08
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;

const int maxn = 100000 + 10;
const long long inf = 1e18;

struct edge
{
    int node, weight;
    edge(int node_, int weight_):
        node(node_), weight(weight_) {}
};

vector<edge> p[maxn];
int c[maxn], dis[maxn], numc[maxn];
int n;
long long dp[maxn];

void dfs1 (int u, int fa)
{
    numc[u] = c[u];

    for (int i = 0; i < p[u].size(); i++)
    {
        int v = p[u][i].node;
        if (v == fa)    continue;
        dis[v] = dis[u] + p[u][i].weight;
        dfs1(v, u);
        numc[u] += numc[v];
    }
}

void dfs2 (int u, int fa)
{
    for (int i = 0; i < p[u].size(); i++)
    {
        int v = p[u][i].node;
        if (v == fa)    continue;
        dp[v] = dp[u] + (numc[1] - 2 * numc[v]) * p[u][i].weight;
        dfs2 (v, u);
    }
}

int main ()
{
//    freopen("P2986_8.in", "r", stdin);
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> c[i];

    int x, y, z;
    for (int i = 1; i < n; i++)
    {
        cin >> x >> y >> z;
        p[x].push_back(edge(y, z));
        p[y].push_back(edge(x, z));
    }

    dfs1(1, 0);
    for (int i = 2; i <= n; i++)
        dp[1] += dis[i] * c[i];

    dfs2(1, 0);
    long long ans = dp[1];
    for (int i = 1; i <= n; i++)
        if (dp[i] < ans)
            ans = dp[i];
    cout << ans << endl;

    return 0;
}

2020/9/4 02:08
加载中...