现在的位置: 首页 > 综合 > 正文

HDU 2196 Computer 树形DP(2个dfs)

2014年07月19日 ⁄ 综合 ⁄ 共 1119字 ⁄ 字号 评论关闭

树形DP, 2 个dfs。

前几天觉得很难,现在可以说是水题了。

View
Code

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 10003

struct E
{
    int v, next, w;
}edge[maxn<<1];

int tot, head[maxn];
int n, m;

void init()
{
    tot = 0;
    memset(head, -1, sizeof(int)*(n+1));
}

void add(int s, int t, int w)
{
    edge[tot].v = t;
    edge[tot].w = w;
    edge[tot].next = head[s];
    head[s] = tot++;
}

int f1[maxn], f2[maxn];
int g1[maxn], g2[maxn];
void dfs1(int u, int pre)
{
    int i;
    f1[u] = f2[u] = 0;
    for(i = head[u]; i != -1; i = edge[i].next)
    {
        int v = edge[i].v;
        if(v == pre) continue;
        int w = edge[i].w;
        dfs1(v, u);
        if(f1[v] + w > f2[u])
        {
            f2[u] = f1[v] + w;
            g2[u] = v;
            if(f1[u] < f2[u])
            {
                swap(f1[u], f2[u]);
                swap(g1[u], g2[u]);
            }
        }
    }
}

void dfs2(int u, int pre)
{
    int i;
    for(i = head[u]; i != -1; i = edge[i].next)
    {
        int v = edge[i].v;
        if(v == pre) continue;
        int w = edge[i].w;
        if(g1[u] == v)
        {
            if(f2[v] < f2[u] + w)
            {
                f2[v] = f2[u] + w;
                g2[v] = u;
                if(f1[v] < f2[v])
                {
                    swap(f1[v], f2[v]);
                    swap(g1[v], g2[v]);
                }
            }
        }
        else
        {
            if(f2[v] < f1[u] + w)
            {
                f2[v] = f1[u] + w;
                g2[v] = u;
                if(f1[v] < f2[v])
                {
                    swap(f1[v], f2[v]);
                    swap(g1[v], g2[v]);
                }
            }
        }
        dfs2(v, u);
    }
}

int main()
{
    int i, j;
    int x, y;
    while( ~scanf("%d", &n))
    {
        init();
        for(i = 2; i <= n; i++)
        {
            scanf("%d%d", &x, &y);
            add(i, x, y);
            add(x, i, y);
        }
        dfs1(1, -1);
        dfs2(1, -1);
        for(i = 1; i <= n; i++)
            printf("%d\n", f1[i]);
    }
    return 0;
}

 

抱歉!评论已关闭.