旅游 题解

旅游

https://ac.nowcoder.com/acm/problem/15748

本题是树形dp,树的最大独立集问题。
自己涂色,那孩子一定不能涂***r>自己不涂色,那孩子无所谓,由于自己也在里面,所以要加一

dp[root][0]+=max(dp[to][0],dp[to][1]);
dp[root][1]+=dp[to][0];

循环外
dp[root][1]+=1;

注意坑点:第一天要在s市住宿,所以答案不是dp数组里的最大值,而是dp[s][1]

#include <bits/stdc++.h>
using namespace std;
vector <int> G[500500];
int dp[500500][2];
void dfs(int root,int pre)
{
    for(int i=0;i<G[root].size();i++)
    {
        int to=G[root][i];
        if(to==pre) continue;
        dfs(to,root);
        dp[root][0]+=max(dp[to][0],dp[to][1]);
        dp[root][1]+=dp[to][0];
    }
    dp[root][1]+=1;
}
int main()
{
    int n,s;
    scanf("%d%d",&n,&s);
    for(int i=1;i<n;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
    dfs(s,0);
    printf("%d\n",dp[s][1]);
}
全部评论

相关推荐

Gaynes:查看图片
点赞 评论 收藏
分享
06-15 18:44
黄淮学院 Java
Lynn012:如果是居民楼还是算了吧,看着有点野呢
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 12:23
转人工😡
门口唉提是地铁杀:五次握手了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务