题目描述
小L放寒假了,他在Z市有很多朋友,于是他决定去朋友家拜年,A市的交通不是很发达,整体呈现出一个树形结构,小L的朋友就住在这棵树的节点上。
小L希望尽可能多的拜访朋友,但是为了节省时间,他决定对于由同一条路连接的两个朋友,只拜访其中一个,即对于结构1 - 2 - 3来说,小L只会选择拜访2或者拜访1, 3,请你告诉小L,他最多能拜访多少朋友。
输入
第一行一个整数表示朋友数量n (n<=50000) 接下来n - 1行每行两个整数,表示一条道路连接两个朋友的住所
输出
一行一个整数表示最多可以拜访的朋友数量
样例输入 Copy
7
6 2
3 4
2 3
1 2
7 6
5 6
样例输出 Copy
4
简单点来说,题意就是,给你一棵树,如果选择一个节点,那么与他相邻的节点就不能选,问你最多可以选多少个节点
分两种情况,两种情况,选根结点,那么子节点就都不能选,不选根结点,那就选最优的子节点
[图片]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e5+5;
std::vector<int> G[maxn];
int vis[maxn],dp[maxn][2],n;
void dfs(int u)
{
vis[u]=1;
dp[u][1]=1;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(!vis[v])
{
dfs(v);
dp[u][1]+=dp[v][0];
dp[u][0]+=max(dp[v][1],dp[v][0]);
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n-1;i++)
{
int u,v;scanf("%d%d",&u,&v);
G[u].emplace_back(v);
G[v].emplace_back(u);
}
dfs(1);
cout<<max(dp[1][0],dp[1][1])<<endl;
return 0;
}