codeforces 1029E Tree with Small Distances

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载,欢迎添加友链。 https://blog.csdn.net/zzk_233/article/details/83246985

这道贪心感觉比较好想吧。。但是有坑点。。

我们发现一个点如果不合法,把他的父节点连到跟比把他自己连到跟要合适一些,所以为了不少不漏情况,

直接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;
}

猜你喜欢

转载自blog.csdn.net/zzk_233/article/details/83246985