• [Usaco2010 Nov]Visiting Cows


    7
    6 2
    3 4
    2 3
    1 2
    7 6
    5 6

    4

    分析:

    树上DP。

    dp[i][0]表示不选i,以i为根的子树的最大答案。

    dp[i][1]表示选i,以i为根的子树的最大答案。

    状态转移方程:dp[i][0]=max(dp[j][0],dp[j][1]),dp[i][1]=1+f[dp][0]

    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <deque>
    #include <map>
    #define range(i,a,b) for(int i=a;i<=b;++i)
    #define LL long long
    #define rerange(i,a,b) for(int i=a;i>=b;--i)
    #define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
    using namespace std;
    pair<int,int>e[150005];
    int tol,h[50005],dp[50005][2],n;
    void add_edge(int x,int y){
        e[++tol].first=y;
        e[tol].second=h[x];
        h[x]=tol;
    }
    void init() {
        cin>>n;
        range(i,1,n-1){
            int x,y;
            cin>>x>>y;
            add_edge(x,y);
            add_edge(y,x);
        }
    }
    void dfs(int x,int fu){
        dp[x][1]=1,dp[x][0]=0;
        for(int i=h[x];i;i=e[i].second){
            int fir=e[i].first;
            if(fir==fu)continue;
            dfs(fir,x);
            dp[x][1]+=dp[fir][0];
            dp[x][0]+=max(dp[fir][1],dp[fir][0]);
        }
    }
    void solve(){
        dfs(1,0);
        cout<<max(dp[1][0],dp[1][1])<<endl;
    }
    int main() {
        init();
        solve();
        return 0;
    }
    View Code
  • 相关阅读:
    主流液晶显示器尺寸参数
    不能访问网络位置的解决方法(转)
    打开Word提示你正试图运行的函数包含有宏或需要宏语言支持的内容
    教你如何防“蹭网”
    ASA数据库瘦身(原创)
    多种解决:“Word无法启动转换器mswrd632.wpc”方法
    百兆线与千兆线网线制作方法
    linux常用命令
    DefaultIfEmpty
    实现手机发送验证码 进行验证
  • 原文地址:https://www.cnblogs.com/Rhythm-/p/9333673.html
Copyright © 2020-2023  润新知