luogu3698 [CQOI2017]小Q的棋盘

最长链是根节点到深度最深的结点的路径。

显然,要么直接走最长链,要么兜兜转转几个圈圈再走最长链,而最长链以外的结点因为要“兜圈”,所以要经过两次。

#include <iostream>
#include <cstdio>
using namespace std;
int n, v, hea[105], cnt, uu, vv, zcl, dep[105], ans;
struct Edge{
	int too, nxt;
}edge[205];
void add_edge(int fro, int too){
	edge[++cnt].nxt = hea[fro];
	edge[cnt].too = too;
	hea[fro] = cnt;
}
void dfs(int x, int f){
	dep[x] = dep[f] + 1;
	zcl = max(zcl, dep[x]);
	for(int i=hea[x]; i; i=edge[i].nxt){
		int t=edge[i].too;
		if(t!=f)	dfs(t, x);
	}
}
int main(){
	cin>>v>>n;
	for(int i=1; i<v; i++){
		scanf("%d %d", &uu, &vv);
		uu++;
		vv++;
		add_edge(uu, vv);
		add_edge(vv, uu);
	}
	dfs(1, 0);
	if(n+1<=zcl)	ans = n + 1;
	else	ans = min(v, (n+1-zcl)/2+zcl);
	cout<<ans<<endl;
	return 0;
}
posted @ 2018-03-15 10:50  poorpool  阅读(169)  评论(0编辑  收藏  举报