poj2152_Fire(树形DP)

来源:互联网 发布:淘宝做客服考试答案 编辑:程序博客网 时间:2024/06/02 04:12
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <vector>#define INF 0x3f3f3f3f#define rep0(i, n) for (int i = 0; i < n; i++)#define rep1(i, n) for (int i = 1; i <= n; i++)#define rep_0(i, n) for (int i = n - 1; i >= 0; i--)#define rep_1(i, n) for (int i = n; i > 0; i--)#define MAX(x, y) (((x) > (y)) ? (x) : (y))#define MIN(x, y) (((x) < (y)) ? (x) : (y))#define mem(x, y) memset(x, y, sizeof(x))#define MAXN 1000 + 10using namespace std;struct Edge{    int from, to, weight;    Edge(int f, int t, int w): from(f), to(t), weight(w) {}};int w[MAXN], d[MAXN], dis[MAXN][MAXN], dp[MAXN][MAXN], ans[MAXN];vector<Edge> edges;vector<int> g[MAXN];void init(int n){    edges.clear();    rep1(i, n)        g[i].clear();    mem(dis, 0);    mem(dp, 0);    mem(ans, 0x3f);}void addEdge(int u, int v, int len){    edges.push_back(Edge(u, v, len));    edges.push_back(Edge(v, u, len));    g[u].push_back(edges.size() - 2);    g[v].push_back(edges.size() - 1);}void dfs_dis(int root, int u, int fa){    for (int i = 0; i < g[u].size(); i++)    {        Edge e = edges[g[u][i]];        if (e.to == fa)            continue;        dis[root][e.to] = dis[e.to][root] = dis[root][u] + e.weight;        dfs_dis(root, e.to, u);    }}void dfs(int n, int u, int fa){    for (int i = 0; i < g[u].size(); i++)    {        Edge e = edges[g[u][i]];        if (e.to == fa)            continue;        dfs(n, e.to, u);    }    for (int j = 1; j <= n; j++)    {        if (dis[u][j] > d[u])        {            dp[u][j] = INF;            continue;        }        dp[u][j] = w[j];        for (int i = 0; i < g[u].size(); i++)        {            Edge e = edges[g[u][i]];            if (e.to == fa)                continue;            dp[u][j] += MIN(ans[e.to], dp[e.to][j] - w[j]);        }        ans[u] = MIN(ans[u], dp[u][j]);    }}int main(){    #ifndef ONLINE_JUDGE        freopen("in.txt", "r", stdin);    #endif // ONLINE_JUDGE    int t, n, u, v, l;    scanf("%d", &t);    while (t--)    {        scanf("%d", &n);        init(n);        rep1(i, n)        {            scanf("%d", w + i);        }        rep1(i, n)            scanf("%d", d + i);        rep0(i, n - 1)        {            scanf("%d %d %d", &u, &v, &l);            addEdge(u, v, l);        }        rep1(i, n)            dfs_dis(i, i, -1);        dfs(n, 1, -1);        printf("%d\n", ans[1]);            }    return 0;}

原创粉丝点击