题意:有n个城市,它们之间通过n-1条道路联通。第一天会在s市住宿,并游览与它距离不超过1的所有城市,之后的每天会选择一个城市住宿,然后游览与它距离不超过1的所有城市。不想住在一个已经浏览过的城市,又想尽可能多的延长旅行时间。最多能度过多少天?
题解:
分类讨论
图片说明 表示在这个城市住下
图片说明 表示不在这个城市住下
那么最后答案肯定是图片说明
然后如果我们要在第图片说明 个城市住下,那么图片说明 即第图片说明个城市住下,那么第图片说明个城市的子节点,全部不能入住
如果我们不在第图片说明个城市住下,那么图片说明
即,选取第图片说明个城市的子节点是否住下的最大值求和

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=5e5+5;
int n,s,f[N],g[N];vector<int>E[N];
void dfs(int u,int fa){
    f[u]=1;
    for(int v:E[u])
        if(v!=fa)
            dfs(v,u),f[u]+=g[v],g[u]+=max(f[v],g[v]);
}
int main(){
    scanf("%d%d",&n,&s);
    for(int i=1,x,y;i<n;++i)scanf("%d%d",&x,&y),E[x].push_back(y),E[y].push_back(x);
    dfs(s,0);printf("%d\n",f[s]);return 0;
}