hdu2196树形dp

刚开始连树形dp,~~

树形dp不仅能连dp,还能练dfs.. 练建邻接表额~~

基本完全参考别人~~~

http://www.cnblogs.com/kuangbin/archive/2012/08/28/2659915.html

#include <iostream>
#include <cstring>
#include <cstdio>
#define MAXM 20000
#define MAXN 20000
#define INF 0x3f3f3f3f
#define BUG printf("here!\n")
using namespace std;
struct node
{
    int u,v,len;
};
node edge[MAXM];
int first[MAXN],next[MAXM];
int maxx[MAXN],smaxx[MAXN];
int maxxid[MAXN],smaxxid[MAXN];
int dp[MAXN],cc;
inline void add_edge(int u,int v,int w)
{
    edge[cc].u=u;
    edge[cc].v=v;
    edge[cc].len=w;
    next[cc]=first[u];
    first[u]=cc;
    cc++;

    edge[cc].u=v;
    edge[cc].v=u;
    edge[cc].len=w;
    next[cc]=first[v];
    first[v]=cc;
    cc++;
}
void dfs1(int u,int p)
{
    maxx[u]=0;
    smaxx[u]=0;
    int i;
    for(i=first[u];i!=-1;i=next[i])
    {
        int v=edge[i].v;
        if(edge[i].v==p)
            continue;
        dfs1(edge[i].v,edge[i].u);
        if(smaxx[u]<maxx[v]+edge[i].len)
        {
            smaxx[u]=maxx[v]+edge[i].len;
            smaxxid[u]=v;
            if(smaxx[u]>maxx[u])
            {
                int t=maxx[u];
                maxx[u]=smaxx[u];
                smaxx[u]=t;

                t=maxxid[u];
                maxxid[u]=smaxxid[u];
                smaxxid[u]=t;
            }
        }
    }
}
void dfs2(int u,int p)
{
    int i,v;
    for(i=first[u];i!=-1;i=next[i])
    {
        v=edge[i].v;
        if(v==p)
            continue;
        if(maxxid[u]==v)
        {
            if(smaxx[v]<smaxx[u]+edge[i].len)
            {
                smaxx[v]=smaxx[u]+edge[i].len;
                smaxxid[v]=u;
                if(smaxx[v]>maxx[v])
                {
                    int t=maxx[v];
                    maxx[v]=smaxx[v];
                    smaxx[v]=t;

                    t=maxxid[v];
                    maxxid[v]=smaxxid[v];
                    smaxxid[v]=t;
                }

            }
        }
        else
        {
            if(smaxx[v]<maxx[u]+edge[i].len)
            {
                smaxx[v]=maxx[u]+edge[i].len;
                smaxxid[v]=u;
                if(smaxx[v]>maxx[v])
                {
                    int t=maxx[v];
                    maxx[v]=smaxx[v];
                    smaxx[v]=t;

                    t=maxxid[v];
                    maxxid[v]=smaxxid[v];
                    smaxxid[v]=t;
                }
            }
        }
        dfs2(v,u);
    }
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int i;
        memset(first,-1,sizeof(first));
        memset(next,-1,sizeof(next));
        cc=0;
        memset(maxx,0,sizeof(maxx));
        memset(smaxx,0,sizeof(smaxx));
        memset(maxxid,0,sizeof(maxxid));
        memset(smaxxid,0,sizeof(smaxxid));
        for(i=2;i<=n;i++)
        {
            int u,l;
            scanf("%d%d",&u,&l);
            add_edge(i,u,l);
        }
        dfs1(1,-1);
        dfs2(1,-1);
        for(i=1;i<=n;i++)
            printf("%d\n",maxx[i]);
    }
    return 0;
}


你可能感兴趣的:(hdu2196树形dp)