这道贪心感觉比较好想吧。。但是有坑点。。
我们发现一个点如果不合法,把他的父节点连到跟比把他自己连到跟要合适一些,所以为了不少不漏情况,
直接dfs遍历整棵树,遇到一个树的子节点不合法就把这个点连到跟,这个时候坑点出现了,因为它是个树,
所以它的子节点的dis值更不更新都没事,反正不会被二次搜到,但是它的父节点一定要更新成2(就是合法),
不然会多出一些情况的,最后统计答案就行了。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
using namespace std;
int n,ans,dis[200005];
vector<int>M[200005];
void dfs(int u,int fa,int cnt)
{
dis[u]=cnt;int flag=0;
int l=M[u].size();
for(int i=0;i<l;i++)
{
if(M[u][i]==fa)continue;
dfs(M[u][i],u,cnt+1);
if(dis[M[u][i]]>2)
{
flag=1;
dis[u]=1;
dis[fa]=2;
}
}
ans+=flag;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n-1;i++)
{
int a,b;scanf("%d%d",&a,&b);
M[a].push_back(b);
M[b].push_back(a);
}
dfs(1,1,0);
printf("%d",ans);
return 0;
}