zoukankan      html  css  js  c++  java
  • SDOI2006 保安站岗

    树形dp

    大水题,直接放代码了qwq(第二位用0 1 2表示三种状态,大力dp就好了)

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<algorithm>
    #include<cstring>
    #include<stack>
    #include<bitset>
    #include<cmath>
    using namespace std;
    const int maxn=100006;
    struct hzw
    {
      int to,next,v;
    }e[maxn];
    int head[maxn],cur,val[maxn];
    inline void add(int a,int b)
    {
        e[cur].to=b;
        e[cur].next=head[a];
        head[a]=cur++;
    }
    int n,m,dp[4][maxn];
    void dfs(int u,int fa)
    {
        int fina=0;dp[2][u]=val[u];
        for (int i=head[u];i!=-1;i=e[i].next)
        {
            int v=e[i].to;
            if (v==fa) continue;
            dfs(v,u);
            fina+=min(dp[1][v],dp[2][v]);
            dp[2][u]+=min(min(dp[0][v],dp[1][v]),dp[2][v]);
        }
        dp[0][u]=fina;dp[1][u]=0x3f3f3f3f;
        for (int i=head[u];i!=-1;i=e[i].next)
        {
            int v=e[i].to;
            if (v==fa) continue;
            dp[1][u]=min(dp[1][u],fina-min(dp[1][v],dp[2][v])+dp[2][v]);
        }
    }
    signed main()
    { 
        memset(head,-1,sizeof(head));
        memset(dp,0x3f,sizeof(dp));
        cin>>n;
        for (int i=1,a,b,c,d,e;i<=n;++i)
        {
            scanf("%d%d%d",&a,&b,&c);
            val[a]=b;
    //        cout<<a<<" "<<b<<" "<<c<<endl;
            for (int j=1;j<=c;++j)
            {
                scanf("%d",&e);
                add(a,e);
                add(e,a);
            }
        }
        dfs(1,1);
        cout<<min(dp[2][1],dp[1][1]);
    }
    
  • 相关阅读:
    jquery扩展
    [转][C#]加密解密类
    [转][C#]压缩解压
    [转][C#]程序的动态编译
    [转][C#]Linq 的扩展方法
    [转]Oracle left join right join
    [转]检测到有潜在危险的 Request.Form 值
    IIS 添加 MIME
    [转][Echarts]俄罗斯方块
    01-python爬虫之常见的加密方式
  • 原文地址:https://www.cnblogs.com/bullshit/p/9629764.html
Copyright © 2011-2022 走看看