题目描述
输入
输出
样例输入
5 2
1 0
2 1
3 2
4 3
样例输出
3
题解
dfs+贪心
先dfs求出以0为起点的最长一条链,这条链上的点只经过一次,消耗1步;其它的点经过后需要返回这条链上,消耗2步。
然后分类讨论是否能走完链和走完树即可。
#include <cstdio> #define N 110 int head[N] , to[N << 1] , next[N << 1] , cnt , deep[N]; void add(int x , int y) { to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt; } void dfs(int x , int fa) { int i; for(i = head[x] ; i ; i = next[i]) if(to[i] != fa) deep[to[i]] = deep[x] + 1 , dfs(to[i] , x); } int main() { int n , p , i , x , y , l = 0; scanf("%d%d" , &n , &p); for(i = 1 ; i < n ; i ++ ) scanf("%d%d" , &x , &y) , add(x , y) , add(y , x); dfs(0 , -1); for(i = 1 ; i < n ; i ++ ) if(l < deep[i]) l = deep[i]; if(p <= l) printf("%d\n" , p + 1); else if(p >= l + 2 * (n - l - 1)) printf("%d\n" , n); else printf("%d\n" , l + (p - l) / 2 + 1); return 0; }
【bzoj4813】[Cqoi2017]小Q的棋盘 dfs+贪心
原文:http://www.cnblogs.com/GXZlegend/p/6727210.html