• luogu 2279 [HNOI2003]消防局的设立 树形dp


    就是细节多一些,思路都非常常规. 

    Code: 

    #include <bits/stdc++.h>    
    #define N 1005 
    #define inf 1061109567
    #define ll long long       
    #define setIO(s) freopen(s".in","r",stdin) 
    using namespace std;     
    int n,edges;  
    int hd[N],to[N<<1],nex[N<<1],f[N][7];  
    void add(int u,int v) 
    {
        nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;   
    }  
    void dfs(int x,int ff) 
    {
        f[x][2]=1;    
        f[x][3]=f[x][4]=0;       
        int sum=0,sum2=0,aa=0,bb=0; 
        for(int i=hd[x];i;i=nex[i]) 
        {
            int v=to[i]; 
            if(v==ff) continue;   
            dfs(v,x);           
            f[x][2]+=min(min(min(f[v][0],f[v][1]), min(f[v][2], f[v][3])), f[v][4]);                      
            sum+=min(f[v][0], f[v][1]);                    
            sum2+=min(min(f[v][0], f[v][1]), min(f[v][2], f[v][3]));                 
            aa+=f[v][0]; 
            bb+=f[v][3];                             
        }   
        if(abs(aa)<=n) f[x][3]=aa;   
        else f[x][3]=inf; 
        if(abs(bb)<=n) f[x][4]=bb;   
        else f[x][4]=inf;                           
        for(int i=hd[x];i;i=nex[i]) 
        {
            int v=to[i]; 
            if(v==ff) continue;   
            if(abs(sum)<=n) f[x][0]=min(f[x][0], sum+f[v][1]-min(f[v][1],f[v][0]));                              
            if(abs(sum2)<=n) f[x][1]=min(f[x][1], sum2+f[v][2]-min(min(f[v][0], f[v][1]), min(f[v][2], f[v][3])));           
        }                
        f[x][3]=min(min(min(f[x][0], f[x][1]), f[x][2]), f[x][3]);    
        f[x][4]=min(f[x][3], f[x][4]);     
    }    
    int main() 
    {  
        int i,j,k; 
        // setIO("input");    
        scanf("%d",&n);   
        for(i=2;i<=n;++i) 
        {
            int x;                 
            scanf("%d",&x),add(i,x),add(x,i); 
        }   
        memset(f,0x3f,sizeof(f));               
        dfs(1,0);  
        printf("%d
    ",min(min(f[1][0], f[1][1]), f[1][2]));                        
        return 0; 
    }
    

      

  • 相关阅读:
    TOJ1017: Tour Guide
    tzcacm去年训练的好题的AC代码及题解
    Educational Codeforces Round 40 (Rated for Div. 2)
    AtCoder Regular Contest 092
    浙南联合训练赛20180318
    [Offer收割]编程练习赛50
    牛客练习赛13
    AtCoder Regular Contest 091
    Codeforces Round #470 (rated, Div. 2, based on VK Cup 2018 Round 1)
    csa Round #73 (Div. 2 only)
  • 原文地址:https://www.cnblogs.com/guangheli/p/11574394.html
Copyright © 2020-2023  润新知