zoukankan      html  css  js  c++  java
  • poj 2152 树形DP

    思路:这个没思路,看了陈启峰的论文写得。

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pb push_back
    #define mp make_pair
    #define Maxn 1010
    #define Maxm 80002
    #define LL __int64
    #define Abs(x) ((x)>0?(x):(-(x)))
    #define lson(x) (x<<1)
    #define rson(x) (x<<1|1)
    #define clr(x,y) memset(x,y,sizeof(x))
    #define inf 0x3f3f3f3f
    #define lowbit(x) (x&(-x))
    #define mod 1000000000
    using namespace std;
    int dp[Maxn][Maxn],best[Maxn],w[Maxn],d[Maxn],n,dis[Maxn],head[Maxn],vi[Maxn],e;
    struct Edge{
        int u,v,next,val;
    }edge[Maxn*2];
    void init()
    {
        clr(vi,0);
        clr(head,-1);
        e=0;
    }
    void add(int u,int v,int val)
    {
        edge[e].u=u,edge[e].v=v,edge[e].val=val,edge[e].next=head[u],head[u]=e++;
        edge[e].u=v,edge[e].v=u,edge[e].val=val,edge[e].next=head[v],head[v]=e++;
    }
    void getdis(int u,int f)
    {
        int i,v,sz;
        vi[u]=1;
        for(i=head[u];i!=-1;i=edge[i].next){
            v=edge[i].v;
            if(v==f) continue;
            dis[v]=dis[u]+edge[i].val;
            getdis(v,u);
        }
    }
    void dfs(int u,int f)
    {
        int i,v,j;
        for(i=head[u];i!=-1;i=edge[i].next){
            v=edge[i].v;
            if(v==f) continue;
            dfs(v,u);
        }
        memset(dis,0,sizeof(dis));
        getdis(u,u);
        best[u]=inf;
        for(i=1;i<=n;i++){
            if(dis[i]>d[u]){dp[u][i]=inf;continue;}
            dp[u][i]=w[i];
            for(j=head[u];j!=-1;j=edge[j].next){
                v=edge[j].v;
                if(v==f) continue;
                dp[u][i]+=min(best[v],dp[v][i]-w[i]);
            }
            if(dp[u][i]<best[u])
                best[u]=dp[u][i];
        }
    }
    int main()
    {
        int t,i,j,u,v,val;
        scanf("%d",&t);
        while(t--){
            init();
            scanf("%d",&n);
            for(i=1;i<=n;i++)
                scanf("%d",w+i);
            for(i=1;i<=n;i++)
                scanf("%d",d+i);
            for(i=1;i<n;i++){
                scanf("%d%d%d",&u,&v,&val);
                add(u,v,val);
            }
            dfs(1,0);
            printf("%d
    ",best[1]);
        }
        return 0;
    }
  • 相关阅读:
    qt 自动产生 Guid 方法
    在QTableWidget中添加QCheckBox并使其居中显示(转)
    QTableWidget控件总结
    QTableWidget 使用及美化_QtableWidget_QtableView滚动条宽度及样式
    QT添加二次确认功能,QMessageBox的使用
    QTableWidget详解(样式、右键菜单、表头塌陷、多选等) 2013-10-23 10:54:04
    QTableWidget的美化
    004PHP基础知识——数据类型(一)
    laravel中修改默认时区
    laravel中Crypt加密方法
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3301950.html
Copyright © 2011-2022 走看看