牛客网 长安大学第三届ACM-ICPC程序设计竞赛(同步赛)G Go For Travel[dfs+想法]

题意:给你一棵树,q个询问,每个询问求从v出发,总步数小于等于k的时候的能走到的最多的点(每个点只算一次)。

题解:可以确定的是走过的路径肯定是一条路径上的边只走过一次+其他走过边都经过两次的情况,所以我们只需要找到距离当前点最远的点,他们之间只走过一次,其他边都计算为两次即可,找树的直径的两端点可以直接找到最远的点在哪里。

AC代码:

#include
#include
#include
#define N 100005
using namespace std;
vectorvt[N];
int dis1[N],dis2[N];
void dfs(int u,int fa)
{
	for(int i=0;i=k)printf("%d\n",k+1);
			else printf("%d\n",min(n,dist+(k-dist)/2+1));
		}
	}
} 


你可能感兴趣的:(dfs,想法)